2012-11-12 13 views
33

Con iPad con iOS6, abbiamo questo bug in cui un controller di visualizzazione modale si espanderà a schermo intero, anche se viene detto a di utilizzare lo stile di presentazione "foglio di calcolo". Ma, questo succede solo se ci sono due modali, uno genitore e suo figlio.iOS 6: ModalPresentationStyle modale del genitore ignorata dopo la rotazione

Quindi questo è il modo viene creato e presentato il primo modale:

UINavigationController *navigationController = [[[UINavigationController alloc] initWithRootViewController:controller] autorelease]; 
navigationController.modalPresentationStyle = UIModalPresentationFormSheet; 
[parentController presentModalViewController:navigationController animated:YES]; 
// parentController is my application's root controller 

Questo è come è stato creato e presentato il modal bambino:

UINavigationController *navigationController = [[[UINavigationController alloc] initWithRootViewController:controller] autorelease]; 
navigationController.modalPresentationStyle = UIModalPresentationFormSheet; 
[parentController presentModalViewController:navigationController animated:YES]; 
// parentController is the navigationController from above 

Così, quando la rotazione dal paesaggio al ritratto, il la modale genitore si espanderà a schermo intero e rimarrà così anche se ruoteremo di nuovo in orizzontale.

Quando il modale padre è tutto da solo (nessuna modal figlio), funziona come previsto, ovvero rimane nello stile del foglio di forma.

Si noti che questo si verifica solo su iOS6 (dispositivo e simulatore) e non si verifica su iOS 5 (simulatore e segnalato al lavoro dai tester).

Finora, ho provato quanto segue senza successo:

  • impostazione wantsFullScreenLayout-NO
  • costringendo wantsFullScreenLayout per tornare sempre NO scavalcarlo
  • Fare certi miei regolatori all'interno del controller di navigazione anche specificare UIModalPresentationFormSheet
  • in esecuzione preferredInterfaceOrientationForPresentation
  • aggiornamento a iOS 6.0.1

Grazie!


UPDATE: Così, ho adattato la risposta da parte dei forum di Apple Developer (https://devforums.apple.com/message/748486#748486) in modo che funzioni con più modale nidificato.

- (BOOL) needNestedModalHack { 
    return [UIDevice currentDevice].systemVersion.floatValue >= 6; 
} 

- (void) willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation 
              duration:(NSTimeInterval)duration { 

    // We are the top modal, make to sure that parent modals use our size 
    if (self.needNestedModalHack && self.presentedViewController == nil && self.presentingViewController) { 
     for (UIViewController* parent = self.presentingViewController; 
      parent.presentingViewController; 
      parent = parent.presentingViewController) { 
      parent.view.superview.frame = parent.presentedViewController.view.superview.frame; 
     } 
    } 

    [super willAnimateRotationToInterfaceOrientation:toInterfaceOrientation duration:duration]; 
} 

- (void) willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation 
           duration:(NSTimeInterval)duration { 
    // We are the top modal, make to sure that parent modals are hidden during transition 
    if (self.needNestedModalHack && self.presentedViewController == nil && self.presentingViewController) { 
     for (UIViewController* parent = self.presentingViewController; 
      parent.presentingViewController; 
      parent = parent.presentingViewController) { 
      parent.view.superview.hidden = YES; 
     } 
    } 

    [super willRotateToInterfaceOrientation:toInterfaceOrientation duration:duration]; 
} 

- (void) didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation { 
    // We are the top modal, make to sure that parent modals are shown after animation 
    if (self.needNestedModalHack && self.presentedViewController == nil && self.presentingViewController) { 
     for (UIViewController* parent = self.presentingViewController; 
      parent.presentingViewController; 
      parent = parent.presentingViewController) { 
      parent.view.superview.hidden = NO; 
     } 
    } 

    [super didRotateFromInterfaceOrientation:fromInterfaceOrientation]; 
} 
+2

Qualcuno mi ha indirizzato ai forum per sviluppatori Apple e ho trovato questo: https://devforums.apple.com/message/748486 – GenesisST

+2

La presentazione di più modali interrompe chiaramente il modo in cui Apple dice che dovresti fare le cose. Se finisci per fare cose come questa che vanno contro i consigli di Apple, allora aspettati problemi come questo. Considerate anche che probabilmente avete un design pessimo. Se vuoi mostrare più viewController come questo dovresti usare il contenimento o un controller di navigazione in una singola presentazione modale. Che cosa hai intenzione di fare quando si interrompe di nuovo in iOS 6.3? – ader

+1

@Ade: questo documento indica che è possibile concatenare i controller di visualizzazione modali: http://developer.apple.com/library/ios/#featuredarticles/ViewControllerPGforiPhoneOS/ModalViewControllers/ModalViewControllers.html#//apple_ref/doc/ uid/TP40007457-CH111-SW1 – GenesisST

risposta

0

Posso vedere 2 problemi qui.

1) in iOS 6 il metodo presentModalViewController:animated: è deprecato, provare a utilizzare presentViewController:animated:completion: (nonostante questo potrebbe non aiuta, è ancora possibile che si desideri farlo)

2) In iOS 6 in qualche modo sembrava che i controllori del contenitore (ad esempio come UINavigationController) non inviare nuovamente i messaggi di autorotazione ai propri figli. Provare la sottoclasse dello UINavigationController e ridefinire i corrispondenti metodi di autorotazione da inviare a tutti i bambini. Questo potrebbe aiutare.

+0

1. D'accordo. Al momento in cui ho scritto questo, stavamo ancora supportando 4.3.

2. Non ho riscontrato problemi durante il test e così lontano dal campo. Io uso molto i controller di navigazione. Forse i miei controller di contenuti sono abbastanza generici e non presentano problemi ...

Immagino che vedremo con iOS7, dal momento che Apple sembra cambiare il modo in cui i callback di rotazione funzionano con tutte le principali versioni ... ;-) – GenesisST

7

Non sono sicuro se questo dovrebbe essere considerato come un bug e sono curioso di ciò che porterà iOS 7, ma la soluzione corrente per questo problema è impostare modalPresentationStyle su UIModalPresentationCurrentContext per child-viewController.

Set modalPresentationStyle = UIModalPresentationCurrentContext 

Questo rende il bambino ancora beeing presentato come FormSheet, ma impedisce il genitore da beeing ridimensionata per fullscreen a rotazione.

Dirk

+0

Questo risolto il mio problema Ho creato un foglio di pagina da un altro foglio di pagina. E dopo aver ridimensionato il foglio della pagina madre occupava tutto il mio schermo. – GxocT

-1

devi instanciate il controller di navigazione dopo la vostra vista principale. In modo da poter gestire la rotazione in ogni vista.

Se il tuo AppDelegate RootViewController è un controller di navigazione, non sarai in grado di gestire la rotazione con le funzioni native.

Problemi correlati