33 votes

iOS 6: Parent modale du modalPresentationStyle ignoré après la rotation

Avec l'iPad iOS6, nous avons ce bug où un modal-vue-contrôleur va passer en mode plein écran, même si il est dit à être à l'aide de "formulaire" modèle de présentation. Mais, cela se produit seulement si il existe deux modaux, un parent et son enfant.

Donc, c'est comment la première modal est créée et présentée:

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

C'est la façon dont l'enfant modal est créée et présentée:

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

Donc, lors de la rotation de paysage à portrait, le parent modale va passer en mode plein écran et de rester de cette façon, même si nous tourner vers le paysage.

Lorsque nous avons le parent modal tout par lui-même (pas d'enfant modale), alors qu'il fonctionne comme prévu, qui est qu'il reste en forme de feuille de style.

Notez que ce qui se passe sur iOS6 seulement (appareil et le simulateur) et n'est pas le cas sur iOS 5 (simulateur et a travaillé par les testeurs).

Jusqu'à présent, j'ai essayé sans succès:

  • paramètre wantsFullScreenLayout de NO
  • forçant wantsFullScreenLayout toujours y revenir NO en la remplaçant
  • La fabrication de certains de mes contrôleurs à l'intérieur de la manette de navigation également spécifier UIModalPresentationFormSheet
  • la mise en œuvre de preferredInterfaceOrientationForPresentation
  • mise à niveau vers iOS 6.0.1

Merci!


Mise à JOUR: Alors, j'ai adapté la réponse de l'Forums des Développeurs Apple (https://devforums.apple.com/message/748486#748486) pour qu'il fonctionne avec de multiples imbriquées modal.

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

7voto

just.do.it Points 61

Vous ne savez pas si cela devrait être considéré comme un bug et je suis curieux de ce que iOS 7 va apporter, mais l'actuelle solution de contournement pour ce problème consiste à définir modalPresentationStyle à UIModalPresentationCurrentContext pour l'enfant-viewController.

Set modalPresentationStyle = UIModalPresentationCurrentContext

Cela rend les enfants encore être présenté comme FormSheet, mais empêche le parent d'être redimensionnée en plein écran sur la rotation.

Dirk

0voto

Alexander Kostiev Points 239

Je vois 2 problèmes ici.

1) dans iOS 6 la méthode presentModalViewController:animated: est obsolète, essayez d'utiliser presentViewController:animated:completion: (malgré cela pourrait ne pas aider, vous pouvez toujours le faire)

2) Dans iOS 6 en quelque sorte apparu que le conteneur contrôleurs (comme UINavigationController) de ne pas renvoyer la rotation automatique des messages à leurs enfants. Essayez de dérivation de l' UINavigationController et de redéfinir le correspondant autorotation méthodes pour être envoyé à tous les enfants. Cela peut vous aider.

-1voto

DjimOnDev Points 151

Vous avez besoin d'instancier votre manette de navigation après votre vue principale. De sorte que vous serez en mesure de gérer la rotation dans chaque vue.

Si votre AppDelegate RootViewController est une manette de navigation, vous ne serez pas en mesure de gérer la rotation avec les fonctions natives.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X