Domanda

I aggiornato a xCode 4.2 ed è nuova funzione storyboard. Tuttavia, non riusciva a trovare un modo per sostenere sia verticale che orizzontale.

Naturalmente, l'ho fatto a livello di codice, con 2 viste, uno per il ritratto e uno per il paesaggio, come ai vecchi tempi, e:

if (interfaceOrientation == UIInterfaceOrientationLandscapeLeft || interfaceOrientation == UIInterfaceOrientationLandscapeRight) 
    {
        self.view = self.landscapeView;
    }
    else
    {
        self.view = self.portraitView;
    }

Ma ero alla ricerca di un modo per farlo automaticamente in qualche modo. Voglio dire, Xcode 4.2 ora, mi aspettavo di più da esso. Grazie a tutti.

==================================
soluzione temporanea:

presenterò qui una soluzione temporanea. Io dico che è temporaneo, perché sto ancora aspettando per i ragazzi di Apple di fare qualcosa di veramente intelligente su questo.

ho creato un altro file .storyboard, chiamato "MainStoryboard_iPhone_Landscape", e implementato i controller di vista del paesaggio lì. In realtà, è esattamente come normale .storyboard (ritratto), ma tutte le schermate sono in modalità orizzontale.

Così mi estrarre il ViewController da storyboard paesaggio, e, quando si verifica la rotazione, basta cambiare self.view con la nuova visualizzazione del viewController.

1.Generate Notifiche quando cambia l'orientamento:

[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];

2.Look per le notifiche:

[[NSNotificationCenter defaultCenter] addObserverForName:UIDeviceOrientationDidChangeNotification object:nil queue:nil usingBlock:^(NSNotification *note) {    
    // We must add a delay here, otherwise we'll swap in the new view  
    // too quickly and we'll get an animation glitch  
    [self performSelector:@selector(updateLandscapeView) withObject:nil afterDelay:0];
}];

3.Attuare updateLandscapeView

- (void)updateLandscapeView {  
 //>     isShowingLandscapeView is declared in AppDelegate, so you won't need to declare it in each ViewController
 UIDeviceOrientation deviceOrientation       = [UIDevice currentDevice].orientation;
 if (UIDeviceOrientationIsLandscape(deviceOrientation) && !appDelegate().isShowingLandscapeView)
 {
     UIStoryboard *storyboard                = [UIStoryboard storyboardWithName:@"MainStoryboard_iPhone_Landscape" bundle:[NSBundle mainBundle]];
     MDBLogin *loginVC_landscape             =  [storyboard instantiateViewControllerWithIdentifier:@"MDBLogin"];
     appDelegate().isShowingLandscapeView    = YES;  
     [UIView transitionWithView:loginVC_landscape.view duration:0 options:UIViewAnimationOptionTransitionCrossDissolve|UIViewAnimationCurveEaseIn animations:^{
         //>     Setup self.view to be the landscape view
         self.view = loginVC_landscape.view;
     } completion:NULL];
 }
 else if (UIDeviceOrientationIsPortrait(deviceOrientation) && appDelegate().isShowingLandscapeView)
 {
     UIStoryboard *storyboard                = [UIStoryboard storyboardWithName:@"MainStoryboard_iPhone" bundle:[NSBundle mainBundle]];
     MDBLogin *loginVC                       = [storyboard instantiateViewControllerWithIdentifier:@"MDBLogin"];
     appDelegate().isShowingLandscapeView    = NO;
     [UIView transitionWithView:loginVC.view duration:0 options:UIViewAnimationOptionTransitionCrossDissolve|UIViewAnimationCurveEaseIn animations:^{
         //>     Setup self.view to be now the previous portrait view
         self.view = loginVC.view;
     } completion:NULL];
 }}

In bocca al lupo a tutti.

P.S: Accetterò la risposta di annuncio Taylor, perché, dopo tanto tempo di attesa e di ricerca di una soluzione, ho finito attuare qualcosa di ispirato dalla sua risposta. Grazie Taylor.

È stato utile?

Soluzione

Questa è una vecchia questione, ma ho letto questa prima parte della giornata e poi ha dovuto spendere una discreta quantità di lavoro a tempo fuori una soluzione migliore. Sono venuto con questa soluzione da hacker il di Apple Alternate Visualizza esempio . In sostanza si sta servendo una vista modale per la vista del paesaggio.

#pragma mark Rotation view control

- (void)orientationChanged:(NSNotification *)notification
{
    // We must add a delay here, otherwise we'll swap in the new view
    // too quickly and we'll get an animation glitch
    [self performSelector:@selector(updateLandscapeView) withObject:nil afterDelay:0];
}

- (void)updateLandscapeView
{
    UIDeviceOrientation deviceOrientation = [UIDevice currentDevice].orientation;
    if (UIDeviceOrientationIsLandscape(deviceOrientation) && !self.isShowingLandscapeView)
    {
        [self performSegueWithIdentifier: @"toLandscape" sender: self];
        self.isShowingLandscapeView = YES;
    }
    else if (deviceOrientation == UIDeviceOrientationPortrait && self.isShowingLandscapeView)
    {
        [self dismissModalViewControllerAnimated:YES];
        self.isShowingLandscapeView = NO;
    }    
}


- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    // Return YES for supported orientations
    return (interfaceOrientation == UIInterfaceOrientationPortrait);
}

Altri suggerimenti

Si dovrebbe generalmente non pensare di opinioni separate per diversi orientamenti meno che non siano molto diverse (che, probabilmente, non dovrebbero essere). Invece, si dovrebbe fare affidamento su il ridimensionamento automatico maschere per disporre come gran parte del contenuto del vostro vista sulla base di restrizioni di base in caso di modifiche del telaio del Superview. Ciò consentirà subviews di rispondere adeguatamente a un cambiamento in telaio della loro superview, spesso a causa di una variazione dell'orientamento interfaccia.

Per rispondere alla tua domanda in modo più diretto, no, non c'è modo per Xcode per assumere o essere detto che vista che si desidera utilizzare per un particolare orientamento interfaccia come questo non è mai stato l'intento di architettura vista di UIKit.

Ecco ulteriori informazioni sulla ridimensionamento automatico maschere: Gestione modifiche al layout automaticamente utilizzando le regole ridimensionamento automatico .

In XCode V4.2.1 quando si utilizza storyboard è possibile modificare solo l'orientamento del controller della vista, e non la vista in sé, quindi se hai inserito un'altra vista lì non sarebbe in grado di cambiare il proprio orientamento, anche se potrebbe vedere la vista in modo corretto.

Quindi il modo precedente di avere due punti di vista non sembrerebbe il lavoro quando si utilizzano storyboard (quando si utilizza il NIB, dove l'orientamento della vista è mutevole per separati Vista).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top