2012-11-12 8 views
33

W przypadku iPada z iOS6 mamy ten błąd, w którym kontroler widoku modalnego zostanie rozwinięty na pełny ekran, nawet jeśli zostanie mu przekazane, aby użyć stylu prezentacji "formularza arkusza". Ale dzieje się tak tylko wtedy, gdy istnieją dwa modalne, jeden nadrzędny i jego potomek.iOS 6: ModalPresentationStyle modułu macierzystego ignorowane po obrocie

Tak to jest jak pierwszy modalna jest tworzony i przedstawione:

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

ten sposób modalny dziecko jest tworzona i przedstawiane:

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

więc podczas obracania z poziomej na pionową, modalny rodzic rozszerzy się do pełnego ekranu i pozostanie w ten sposób, nawet jeśli przywrócimy krajobraz.

Gdy mamy modalny nadrzędny sam (bez modalnego podrzędnego), to działa zgodnie z oczekiwaniami, czyli pozostaje w stylu arkusza formularza.

Należy pamiętać, że dzieje się tak tylko w systemie iOS6 (urządzenie i symulator) i nie ma miejsca na iOS 5 (symulator i zgłoszony do pracy przez testerów).

Dotychczas Próbowałem następujących bez powodzenia:

  • zachodzącego wantsFullScreenLayout do NO
  • zmuszając wantsFullScreenLayout zawsze powrócić NO nadrzędnymi go
  • upewniając moje kontrolerów wewnątrz kontrolera nawigacyjnego również określić UIModalPresentationFormSheet
  • implementacja preferredInterfaceOrientationForPresentation
  • uaktualnienie do iOS 6.0.1

Dzięki!


UPDATE: Więc dostosowany odpowiedź z forum Jabłko deweloperów (https://devforums.apple.com/message/748486#748486), tak, że działa ze stwardnieniem zagnieżdżonego modalnej.

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

Ktoś wskazał mi na forach programistów Apple i znalazłem to: https://devforums.apple.com/message/748486 – GenesisST

+2

Przedstawianie wielu modów wyraźnie łamie sposób, w jaki Apple twierdzi, że powinieneś robić różne rzeczy. Jeśli kończysz robić takie rzeczy, które idą wbrew radom Apple'a, spróbuj spodziewać się takich problemów. Weź również pod uwagę, że prawdopodobnie masz bardzo zły projekt. Jeśli chcesz wyświetlić wiele kontrolerów viewController w ten sposób, powinieneś używać przechowalni lub kontrolera navigationController w jednej prezentacji modalnej. Co zrobisz, gdy to się powtórzy w iOS 6.3? – ader

+1

@Ade: w tym dokumencie wymieniono kontrolery widoku modalnego: http://developer.apple.com/library/ios/#featuredarticles/ViewControllerPGforiPhoneOS/ModalViewControllers/ModalViewControllers.html#//apple_ref/doc/ uid/TP40007457-CH111-SW1 – GenesisST

Odpowiedz

0

Widzę tutaj 2 problemy.

1) w iOS 6, metoda presentModalViewController:animated: jest przestarzała, użyj presentViewController:animated:completion: (mimo to może nie pomóc, nadal może chcieć to zrobić)

2) W iOS 6 jakoś wydawało się, że kontrolery pojemnik (taki jako UINavigationController) nie wysyłaj ponownie wiadomości autorotate do swoich dzieci. Spróbuj podklasy UINavigationController i przedefiniować odpowiednie metody autorotation, które zostaną wysłane do wszystkich dzieci. To może pomóc.

+0

1. Uzgodnione. W czasie, kiedy to pisałem, nadal wspieraliśmy 4.3.

2. Nie napotkałem problemów podczas testowania i tak daleko od pola. Używam dużo kontrolerów nawigacyjnych. Być może moje kontrolery treści są generyczne i nie wykazują żadnych problemów ...

Myślę, że zobaczymy w iOS7, ponieważ Apple wydaje się zmieniać sposób, w jaki działają wywołania zwrotne w każdej głównej wersji ... ;-) – GenesisST

7

Nie jestem pewien, czy to powinno być uważane za błąd i jestem ciekawy, co przyniesie iOS 7, ale aktualne obejście tego problemu polega na ustawieniu modalPresentationStyle na UIModalPresentationCurrentContext dla kontrolki child-viewController.

Set modalPresentationStyle = UIModalPresentationCurrentContext 

To sprawia, że ​​dziecko nadal jest prezentowane jako FormSheet, ale zapobiega zmianie rozmiaru elementu nadrzędnego na pełny ekran.

Dirk

+0

rozwiązał mój problem. Stworzyłem arkusz strony z innego arkusza strony. A po zmianie rozmiaru nadrzędny arkusz strony zajmował cały mój ekran. – GxocT

-1

Musisz zaindeksować swój kontroler nawigacyjny po głównym widoku. Abyś mógł zarządzać rotacją w każdym widoku.

Jeśli kontroler nawigacji AppDelegate RootViewController jest kontrolerem nawigacyjnym, nie będzie można zarządzać rotacją za pomocą funkcji rodzimych.

Powiązane problemy