2013-05-02 5 views
15

Quindi sto sviluppando un'app per iPad che supporta solo la modalità orizzontale tranne per un controller di visualizzazione modale. Il problema che sto avendo è che una volta che ho presentato la vista modale e cambiato l'orientamento in verticale e poi ho abbandonato la vista, la vista genitore (che dovrebbe supportare solo il panorama) è in modalità verticale finché non ruoto il dispositivo in cui poi torna a paesaggio e rimane così. Mi sono picchiato cercando di capire come mantenere l'orientamento originale dei genitori, ma non sono stato in grado di trovare una soluzione.Il mantenimento dell'orientamento della vista genitore dopo la visualizzazione modale è stato presentato con un diverso orientamento

ho il seguente codice nel mio app delegato per consentire l'orientamento cambia solo su quella vista singola modale (GalleryPhotoViewer):

- (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window{ 
NSUInteger orientations = UIInterfaceOrientationMaskAllButUpsideDown; 

    if(self.window.rootViewController){ 
     UIViewController *presentedViewController = [[(UINavigationController *)self.window.rootViewController viewControllers] lastObject]; 

     //Support Portrait mode only on Photoviewer 
     if ([[presentedViewController presentedViewController] isKindOfClass:GalleryPhotoViewController.class]) { 
      orientations = UIInterfaceOrientationMaskAll; 
     }else{ 
      orientations = [presentedViewController supportedInterfaceOrientations]; 

     } 
    } 

    return orientations; 
} 

Dalla classe genitore (PhotosViewController) che io chiamo:

GalleryPhotoViewController *gpView = [GalleryPhotoViewController new]; 
[self presentViewController:gpView animated:YES completion:nil]; 

anche nel mio genitore (e altri punti di vista) ho il seguente codice per disabilitare la modalità portrait:

- (NSUInteger)supportedInterfaceOrientations{ 
    return UIInterfaceOrientationMaskLandscapeLeft | UIInterfaceOrientationMaskLandscapeRight; 
} 

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 
{ 
    if(interfaceOrientation == UIInterfaceOrientationPortrait) { 
     return YES; 
    } else { 
     return NO; 
    } 
} 

Qualche idea su come posso mantenere l'orientamento sulla vista genitore? Stavo pensando di modificare semplicemente l'orientamento sul genitore nel metodo viewWillAppear una volta che la modal è stata chiusa, ma poi non avrei saputo quale fosse l'orientamento precedente, per non parlare del fatto che non sono stato in grado di trovare il codice per farlo indipendentemente da iOS6.

EDIT/SOLUZIONE: Così ho trovato una soluzione e quello che ho finito per fare stava lasciando l'applicazione: supportedInterfaceOrientationsForWindow: codice e semplicemente aggiungendo la sottoclasse UINavigation alla vista primaria che è stata presenta la vista modale e tutto ha funzionato come previsto e la il genitore ha mantenuto il suo orientamento originale mentre il modale è stato in grado di cambiare liberamente.

Nel mio genitore:

//To make sure that this view remains in Landscape 
@implementation UINavigationController (Rotation_IOS6) 

-(BOOL)shouldAutorotate 
{ 
    return [[self.viewControllers lastObject] shouldAutorotate]; 
} 

-(NSUInteger)supportedInterfaceOrientations 
{ 
    return [[self.viewControllers lastObject] supportedInterfaceOrientations]; 
} 

@end 

Grazie @ Matt per i suggerimenti.

risposta

11

Penso che il problema sia l'utilizzo di application:supportedInterfaceOrientationsForWindow:. Invece, sbarazzati di questo e inizia con una sottoclasse UINavigationController e rendi quella classe il controller della vista radice che è la tua interfaccia di navigazione. Poi:

  • nella sottoclasse UINavigationController, tornare UIInterfaceOrientationMaskLandscape da supportedInterfaceOrientations.

  • Nel controller di visualizzazione (modale) presentato, restituire UIInterfaceOrientationMaskAll da supportedInterfaceOrientations.

+0

Così ho trovato una soluzione e quello che ho finito per fare stava lasciando l'applicazione: supportedInterfaceOrientationsForWindow: codice e semplicemente aggiungendo la sottoclasse UINavigation alla vista primaria che è stata presenta la vista modale e tutto funzionava. Grazie per l'aiuto. – shokaveli

+0

Se ho aiutato, puoi accettare la mia risposta, forse? I * think * la mia risposta ha dato l'analisi corretta, ovvero che era il tuo uso di 'application: supportedInterfaceOrientationsForWindow:' questo è stato un pasticcio, e dovresti usare 'supportedInterfaceOrientations' di UINavigationController contro 'supportedInterfaceOrientations 'del controller di visualizzazione modale. – matt

+1

@matt: ho impostato sopra quello che hai detto ma ho comunque ottenuto il ritratto mentre congedo il controller della vista. Cosa dovrei avere bisogno di impostare nella vista genitore – TamilKing

Problemi correlati