Problème de rotation iOS 6 – Pas de rotation du controller Modal View présenté

J'ai un MainViewController qui a un button qui pousse une nouvelle vue (InfoViewController), via flip horizontalement. ainsi:

controller.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal; [self presentModalViewController:controller animated:YES]; 

Le controller MainView prend en charge Portrait et PortraitUpsideDown. Ainsi:

 - (BOOL)shouldAutorotate { return YES; } - (NSUInteger)supportedInterfaceOrientations { return (UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskPortraitUpsideDown); } 

Dans mon InfoViewController, il indique également le code ci-dessus. Dans mon AppDelegate il a ceci dans les LaunchOptions:

 [self.window setRootViewController:self.mainViewController]; 

Dans mon file app.plist, il prend en charge toutes les orientations. En effet, d'autres vues doivent également prendre en charge le paysage. Donc, sur mon MainViewController et InfoViewController j'ai seulement besoin de Portrait et PortraitUpsideDown. Mais d'un autre sharepoint vue j'ai besoin de toutes les ornements.

Mon MainViewController fonctionne bien, mais mon InfoViewController fonctionne pour toutes les orientations.

J'ai des difficultés extrêmes à essayer de faire fonctionner cela dans iOS6. J'ai fait des searchs sur d'autres publications et j'ai essayé l'aide fournie par d'autres, mais je n'ai pas eu de chance. S'il vous plaît quelqu'un peut-il m'aider à atteindre ce merci. Et je suis un newbie d'Objective-C: p

Ne prenez pas en charge toutes les orientations dans votre file plist d'application, uniquement celles que votre controller de vue racine prend en charge.

L'autorotation change dans iOS 6. Dans iOS 6, la méthode shouldAutorotateToInterfaceOrientation: de UIViewController est obsolète. À sa place, vous devez utiliser les methods supportedInterfaceOrientationsForWindow: et shouldAutorotate :

 - (BOOL)shouldAutorotate { return YES; } - (NSUInteger)supportedInterfaceOrientations { return UIInterfaceOrientationMaskAllButUpsideDown; } 

Les ViewController modaux ne reçoivent plus d'appels de rotation dans iOS 6: willRotateToInterfaceOrientation:duration:, willAnimateRotationToInterfaceOrientation:duration:, et didRotateFromInterfaceOrientation: methods ne sont plus appelées sur un controller de vue qui effectue une présentation en plein écran sur lui-même, par exemple ceux qui sont appelés avec: presentViewController:animated:completion:

Vous pouvez laisser le controller de vue qui présente votre controller de vue modale l'informer de la rotation. Aussi, maintenant vous utilisez: presentViewController:animated:completion: pour présenter le controller de vue. presentModalViewController:animated: est déconseillé que vous utilisez dans le code.

J'ai résolu des problèmes similaires, tout en utilisant le controller de barre d'onglet.

Sous-class UITabBarController. Implémentez ces methods:

 - (NSUInteger)supportedInterfaceOrientations { return UIInterfaceOrientationMaskAll; } - (BOOL)shouldAutorotate { NSLog(@"Orientation:%d", [[UIDevice currentDevice] orientation]); for (UIViewController *viewController in self.viewControllers) { [viewController shouldAutorotate]; } return YES; } 

Si vous souhaitez gérer les rotations dans les controllers à l'intérieur de tabbarcontroller, dans chacun des controllers du controller de barre d'tabs, implémentez ces methods et écrivez du code pour gérer les changements d'orientation. Si vous ne voulez pas le gérer, vous n'avez pas besoin d'implémenter ces methods. Les methods TabBarControllers seront toujours exécutées lorsque l'orientation change. Même deux fois pour une raison inconnue.

Oui, et n'oubliez pas de supprimer toutes les methods shouldAutorotate. Je suis passé complètement au nouveau model d'orientation. Si vous voulez les faire restr, probablement, ce sera plus difficile.

Créez une catégorie en sous-classant UINavigationController et implémentez les methods suivantes dans le file .h

 -(BOOL)shouldAutorotate; -(NSUInteger)supportedInterfaceOrientations; - (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation; in .m file -(BOOL)shouldAutorotate { return [self.topViewController shouldAutorotate]; } -(NSUInteger)supportedInterfaceOrientations { return [self.topViewController supportedInterfaceOrientations]; } -(UIInterfaceOrientation)preferredInterfaceOrientationForPresentation { return [self.topViewController preferredInterfaceOrientationForPresentation]; } 

et mettre en œuvre les methods suivantes dans la class de controller de vue, la class que vous souhaitez activer la rotation

 -(NSUInteger)supportedInterfaceOrientations { return (UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskLandscapeLeft | UIInterfaceOrientationMaskLandscapeRight | UIInterfaceOrientationMaskPortraitUpsideDown); } - (BOOL)shouldAutorotate { return YES; } - (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation { return UIInterfaceOrientationLandscapeLeft; } 

ajoutez ce code sur la sous-class UITabBarController .m

 @implementation UINavigationController (rotation) //temp hack for iOS6, this allows passing supportedInterfaceOrientations to child viewcontrollers. - (NSUInteger)supportedInterfaceOrientations { return [self.topViewController supportedInterfaceOrientations]; } @end @implementation NameClassUITabBar - (void)viewDidLoad { [super viewDidLoad]; } - (BOOL)shouldAutorotate { return YES; } - (NSUInteger)supportedInterfaceOrientations { return UIInterfaceOrientationMaskLandscape; } @end 

Ici, j'ai posté ma solution / experince dans le controller de barre d'tabs avec des rotations: http://luterr.blogspot.sg/2015/04/example-code-uiinterfaceorientationmask.html