iOS 6: ModalPresentationStyle modułu macierzystego ignorowano po obrocie

W iPadzie z iOS6 mamy ten błąd, który powoduje, że kontroler widoku modalnego rozszerzy się do pełnego ekranu, nawet jeśli ma być używany styl prezentacji „arkusza formularzy”. Ale dzieje się tak tylko wtedy, gdy istnieją dwa moduły, rodzic i jego dziecko.

Tak powstaje pierwszy modal i jest prezentowany:

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

W ten sposób tworzony i prezentowany jest modal potomny:

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

Tak więc obracając się z krajobrazu na portret, macierzysty modal rozszerzy się do pełnego ekranu i pozostanie taki, nawet jeśli obrócimy się z powrotem do krajobrazu.

Kiedy mamy nadrzędny modal sam (bez modalu potomnego), to działa zgodnie z oczekiwaniami, co oznacza, że ​​pozostaje w stylu arkusza formularza.

Zauważ, że dzieje się to tylko na iOS6 (urządzenie i symulator) i nie dzieje się na iOS 5 (symulator i zgłaszane do pracy przez testerów).

Do tej pory bez powodzenia próbowałem:

oprawawantsFullScreenLayout doNOzmuszaniewantsFullScreenLayout zawsze wracaćNO nadpisując toOkreślanie moich kontrolerów wewnątrz kontrolera nawigacji również określaUIModalPresentationFormSheetrealizowaniepreferredInterfaceOrientationForPresentationuaktualnienie do iOS 6.0.1

Dzięki!

AKTUALIZACJA: Więc dostosowałem odpowiedź z forów programistów Apple (https://devforums.apple.com/message/748486#748486), aby działał z wieloma zagnieżdżonymi modalnymi.

- (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];
}

questionAnswers(3)

yourAnswerToTheQuestion