2012-11-12 3 views
33

Bei iPad mit iOS6 haben wir diesen Fehler, bei dem ein Modalansicht-Controller auf Vollbild erweitert wird, auch wenn er den Präsentationstil "Formularblatt" verwendet. Aber das passiert nur, wenn es zwei Modale gibt, ein Elternteil und sein Kind.iOS 6: modalPresentationStyle des übergeordneten Modales wird nach der Drehung ignoriert

Also das ist, wie die erste modale erstellt und präsentiert werden:

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

Dies ist, wie das Kind modal erstellt und präsentiert werden:

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

Also, wenn von Quer- auf Hochformat gedreht wird, die Übergeordnetes Modal wird auf Vollbild erweitert und bleibt auch dann erhalten, wenn wir in die Landschaft zurückkehren.

Wenn wir das Parent-Modal ganz allein haben (kein Child-Modal), dann funktioniert es wie erwartet, das heißt, es bleibt im Formular-Sheet-Stil.

Beachten Sie, dass dies nur auf iOS6 (Gerät und Simulator) geschieht und nicht auf iOS 5 (Simulator und von Testern gemeldet).

Bisher habe ich das ohne Erfolg folgendes versucht:

  • wantsFullScreenLayout zu NO
  • zwingen wantsFullScreenLayout Einstellung immer NO zurückzukehren, indem es
  • macht sicher, dass meine Controller innerhalb des Navigationscontroller auch zwingenden angeben UIModalPresentationFormSheet
  • Implementierung preferredInterfaceOrientationForPresentation
  • Upgrade auf iOS 6.0.1

Vielen Dank!


UPDATE: Also, angepasst ich die Antwort von den Apple Developer Forums (https://devforums.apple.com/message/748486#748486), so dass es mit mehreren verschachtelten modal funktioniert.

- (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

Jemand wies mich auf die Apple Entwickler-Foren und ich fand dies: https://devforums.apple.com/message/748486 – GenesisST

+2

Präsentieren mehrere Modale eindeutig bricht die Art und Weise Apple sagen Sie sollten Dinge tun. Wenn Sie solche Dinge tun, die gegen den Rat von Apple verstoßen, dann erwarten Sie solche Probleme. Bedenken Sie auch, dass Sie wahrscheinlich ein sehr schlechtes Design haben. Wenn Sie mehrere ViewController wie diese anzeigen möchten, sollten Sie containment oder einen navigationController in einer einzelnen modalen Präsentation verwenden. Was wirst du tun, wenn das in iOS 6.3 wieder aufhört? – ader

+1

@Ade: In diesem Dokument wird erwähnt, dass es möglich ist, Modal View-Controller zu verketten: http://developer.apple.com/library/ios/#featuredarticles/ViewControllerPGforiPhoneOS/ModalViewControllers/ModalViewControllers.html#//apple_ref/doc/ uid/TP40007457-CH111-SW1 – GenesisST

Antwort

0

Ich kann 2 Probleme hier sehen.

1) in iOS 6 die Methode presentModalViewController:animated: veraltet ist, versuchen Sie es mit presentViewController:animated:completion: (trotz könnte dies nicht helfen, Sie wollen immer noch kann es zu tun)

2) In iOS 6 irgendwie, dass Container-Controller erschien (wie als UINavigationController) senden Sie die Autorotate Nachrichten nicht an ihre Kinder. Versuchen Sie, die Klasse UINavigationController zu unterklassifizieren und die entsprechenden Autorotationsmethoden neu zu definieren, die an alle untergeordneten Objekte gesendet werden sollen. Dies könnte helfen.

+0

1. Einverstanden. Zu der Zeit, als ich das schrieb, unterstützten wir immer noch 4.3.

2. Ich habe keine Probleme beim Testen und so weit vom Feld. Ich benutze Navigationscontroller viel. Vielleicht sind meine content controller generisch genug und zeigen keine Probleme ...
Ich denke, wir werden mit iOS7 sehen, da Apple scheint die Art und Weise zu ändern, wie Rotationsrückrufe mit jeder Hauptversion funktionieren ... ;-) – GenesisST

7

Nicht sicher, ob dies als ein Fehler betrachtet werden sollte und ich bin gespannt, was iOS 7 bringt, aber die aktuelle Problemumgehung für dieses Problem ist, modalPresentationStyle auf UIModalPresentationCurrentContext für die Child-ViewController setzen.

Set modalPresentationStyle = UIModalPresentationCurrentContext 

Das das Kind macht immer noch als Formblatt präsentiert beeing aber verhindert, dass die Eltern von der Rotation auf Vollbild der Größe verändert beeing.

Dirk

+0

Dies ist löste mein Problem. Ich habe ein Seitenblatt aus einem anderen Seitenblatt erstellt. Und nach dem Ändern der Größe des Elternblattes war mein gesamter Bildschirm besetzt. – GxocT

-1

Sie benötigen eine Navigationssteuerung nach dem Hauptansicht instanziieren. Damit können Sie die Rotation in jeder Ansicht verwalten.

Wenn Ihr AppDelegate RootViewController ein Navigationscontroller ist, können Sie die Rotation nicht mit nativen Funktionen verwalten.

Verwandte Themen