2010-11-19 11 views
9

Mi piacerebbe gestire il cambio di orientamento su un'applicazione iPad con un UIViewController e due XIB, diciamo MenuView e MenuViewLandscape.Modifica orientamento orientamento su iPad con un UIViewController e due XIB

Quindi, nel metodo willRotateToInterfaceOrientation di MenuViewController, come posso modificare XIB senza utilizzare un altro controller per la modalità orizzontale?

Sto utilizzando il seguente codice:

if(toInterfaceOrientation != UIInterfaceOrientationPortrait){ 
    MenuViewController *landscape = [[MenuViewController alloc] 
             initWithNibName: @"MenuViewLandscape" 
             bundle:nil 
            ];   
    [self setView:landscape.view]; 
} 
else { 
    MenuViewController *potrait = [[MenuViewController alloc] 
            initWithNibName: @"MenuView" 
            bundle:nil 
            ];   
    [self setView:potrait.view]; 
} 

ma quando vado al paesaggio visualizzare l'XIB la vista del paesaggio controlli non sono adeguatamente ruotati.

+0

Hai avuto fortuna con questo? – RefuX

+0

vedere la risposta sotto –

risposta

12

non sono sicuro ci sono strani effetti collaterali con questa implementazione, ma provare qualcosa di simile e vedere se funziona per voi:

-(void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)orientation duration:(NSTimeInterval)duration { 
    if (UIInterfaceOrientationIsPortrait(orientation)) { 
     [[NSBundle mainBundle] loadNibNamed:@"MenuView" owner:self options:nil]; 
     if (orientation == UIInterfaceOrientationPortraitUpsideDown) { 
      self.view.transform = CGAffineTransformMakeRotation(M_PI); 
     } 
    } else if (UIInterfaceOrientationIsLandscape(orientation)){ 
     [[NSBundle mainBundle] loadNibNamed:@"MenuViewLandscape" owner:self options:nil]; 
     if (orientation == UIInterfaceOrientationLandscapeLeft) { 
      self.view.transform = CGAffineTransformMakeRotation(M_PI + M_PI_2); 
     } else { 
      self.view.transform = CGAffineTransformMakeRotation(M_PI_2); 
     } 
    } 
} 

Ciò presuppone che il proprietario del file nel vostro MenuView e MenuViewLandscape XIBs sono entrambi impostati su MenuViewController e la vista è impostata su entrambi gli XIB. Tutte le prese devono essere correttamente ricollegate alla rotazione quando si utilizza loadNibNamed.

Se si sta costruendo per iOS 4, si potrebbe anche sostituire le loadNibNamed linee con questi:

UINib *nib = [UINib nibWithNibName:@"MenuView" bundle:nil]; 
UIView *portraitView = [[nib instantiateWithOwner:self options:nil] objectAtIndex:0]; 
self.view = portraitView; 

e

UINib *nib = [UINib nibWithNibName:@"MenuViewLandscape" bundle:nil]; 
UIView *landscapeView = [[nib instantiateWithOwner:self options:nil] objectAtIndex:0]; 
self.view = landscapeView; 

Questi supporre che l'UIView che si desidera visualizzare immediatamente segue il Proprietario del file e oggetti proxy First Responder negli XIB.

Quindi è necessario assicurarsi che le viste siano ruotate correttamente per l'orientamento dell'interfaccia. Per tutte le viste che non hanno l'orientamento verticale predefinito, ruotale impostando la proprietà transform della vista e utilizzando CGAffineTransformMakeRotation() con i valori appropriati, come mostrato nell'esempio sopra.

La rotazione da sola potrebbe risolvere il problema senza il carico aggiuntivo dei NIB. Tuttavia, il caricamento di un'intera nuova istanza di MenuViewController e l'impostazione della sua vista sulla vista esistente di MenuViewController potrebbe causare alcuni strani comportamenti con gli eventi del ciclo di vita e di rotazione, pertanto potrebbe risultare più sicuro provare gli esempi sopra riportati. Inoltre ti risparmiano la fatica di dover creare nuove istanze MenuViewController quando ti serve solo la vista.

Spero che questo aiuti!

Justin

+0

Ciao Justin.Ho provato la tua soluzione e funziona perfettamente con Portrait. Per Landscape tuttavia è tutto sfocato. Ruotato correttamente, ma con testo e etichette sfocati, tutto è praticamente sfocato. Alcune linee sono frastagliate. Qualche idea ? grazie. – TrekOnTV2017

1

Forse la risposta da Jon Rodriguez qui farà quello che vuoi:

Want to use muliple nibs for different iphone interface orientations

Se si dispone di due classi UIViewController, una classe di base per la modalità ritratto e una sottoclasse di che, per in modalità orizzontale, puoi inserire quasi tutto il codice nella classe base. In modo che ti dà la maggior parte dei vantaggi di una singola classe di visualizzazione del controller, mentre anche consentendo di utilizzare altre soluzioni come questa:

Easiest way to support multiple orientations? How do I load a custom NIB when the application is in Landscape?