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
doNO
zmuszaniewantsFullScreenLayout
zawsze wracaćNO
nadpisując toOkreślanie moich kontrolerów wewnątrz kontrolera nawigacji również określaUIModalPresentationFormSheet
realizowaniepreferredInterfaceOrientationForPresentation
uaktualnienie do iOS 6.0.1Dzię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];
}