85 votes

Comment forcer un UIViewController à s'orienter dans iOS 6

Comme ShouldAutorotateToInterfaceOrientation est obsolète dans iOS 6 et que je l’utilisais pour forcer une vue particulière à portrait uniquement , quelle est la bonne façon de procéder dans iOS 6? Ce n'est que pour une zone de mon application, toutes les autres vues peuvent pivoter.

Je vous remercie.

117voto

Anthony Points 2440

Si vous souhaitez que tous nos contrôleurs de navigation respectent le contrôleur de la vue de dessus, vous pouvez utiliser une catégorie pour ne pas avoir à modifier et modifier un grand nombre de noms de classes.

 @implementation UINavigationController (Rotation_IOS6)

-(BOOL)shouldAutorotate
{
    return [[self.viewControllers lastObject] shouldAutorotate];
}

-(NSUInteger)supportedInterfaceOrientations
{
    return [[self.viewControllers lastObject] supportedInterfaceOrientations];
}

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
{
    return [[self.viewControllers lastObject] preferredInterfaceOrientationForPresentation];
}

@end
 

Comme le soulignent quelques commentaires, il s’agit d’une solution rapide au problème. Une meilleure solution est la sous-classe UINavigationController et placez ces méthodes ici. Une sous-classe aide également à supporter 6 et 7.

63voto

Phil Points 730

Le meilleur moyen pour iOS6, plus précisément, c'est noté dans "iOS6 Par Tutoriels" par le Rayon Wenderlich équipe - http://www.raywenderlich.com/ et c'est mieux que de sous-classement UINavigationController pour la plupart des cas.

Je suis sous iOS6 avec un scénario qui comprend un UINavigationController défini comme le point de vue initial du contrôleur.

//AppDelegate.m - cette méthode n'est pas disponible en pré-iOS6 malheureusement

- (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window{
NSUInteger orientations = UIInterfaceOrientationMaskAllButUpsideDown;

if(self.window.rootViewController){
    UIViewController *presentedViewController = [[(UINavigationController *)self.window.rootViewController viewControllers] lastObject];
    orientations = [presentedViewController supportedInterfaceOrientations];
}

return orientations;
}

//MyViewController.m - de retour quel que soit orientations à prendre en charge pour chaque UIViewController

- (NSUInteger)supportedInterfaceOrientations{
    return UIInterfaceOrientationMaskPortrait;
}

39voto

Craig Watkinson Points 469

Cette réponse concerne les questions posées dans les commentaires de l'OP, post:

Pour forcer une vue à apparaître dans un oriention mettre ce qui suit dans viewWillAppear:

UIApplication* application = [UIApplication sharedApplication];
if (application.statusBarOrientation != UIInterfaceOrientationPortrait)
{
    UIViewController *c = [[UIViewController alloc]init];
    [self presentModalViewController:c animated:NO];
    [self dismissModalViewControllerAnimated:NO];
}

C'est un peu un hack, mais cela oblige l' UIViewController à être présenté en portrait, même si le contrôleur précédent était de paysage

Mise à JOUR pour iOS7

Les méthodes ci-dessus sont désormais obsolète, donc pour iOS 7 utiliser les éléments suivants:

UIApplication* application = [UIApplication sharedApplication];
if (application.statusBarOrientation != UIInterfaceOrientationPortrait)
{
     UIViewController *c = [[UIViewController alloc]init];
     [c.view setBackgroundColor:[UIColor redColor]];
     [self.navigationController presentViewController:c animated:NO completion:^{
            [self.navigationController dismissViewControllerAnimated:YES completion:^{
            }];
     }];
}

Il est intéressant de noter, au moment de l'écriture, soit de les présenter ou de les rejeter doivent être animés. Si ni l'êtes, alors vous obtiendrez un écran blanc. Aucune idée de pourquoi cela fait ça marche, mais il ne! L'effet visuel est différent en fonction de ce qui est animé.

36voto

rocky Points 1847

Donc, j'ai rencontré le même problème lors de l'affichage de portrait à seulement modal points de vue. Normalement, j'avais créer un UINavigationController, définir le viewController comme le rootViewController, puis afficher les navigationController comme un modal vue. Mais avec iOS 6, le viewController vais maintenant demander à la navigationController pour ses prises en charge de l'interface orientations (qui, par défaut, est, maintenant, pour iPad et tout, mais à l'envers pour l'iPhone).

Solution: j'ai eu une classe de UINavigationController et remplacer l'autorotation méthodes. Type de lame.

- (BOOL)shouldAutorotate {
    return NO;
}

- (NSUInteger)supportedInterfaceOrientations {
    return UIInterfaceOrientationMaskPortrait;
}
// pre-iOS 6 support 
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation {
    return (toInterfaceOrientation == UIInterfaceOrientationPortrait);
}

15voto

Roshan Jalgaonkar Points 257

IOS 5

 - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation{

    return (interfaceOrientation == UIInterfaceOrientationPortrait);

}
 

IOS 6

 -(BOOL)shouldAutorotate{
    return YES;
}

-(NSInteger)supportedInterfaceOrientations{

    //    UIInterfaceOrientationMaskLandscape;
    //    24
    //
    //    UIInterfaceOrientationMaskLandscapeLeft;
    //    16
    //
    //    UIInterfaceOrientationMaskLandscapeRight;
    //    8
    //
    //    UIInterfaceOrientationMaskPortrait;
    //    2

    //    return UIInterfaceOrientationMaskPortrait; 
    //    or
          return 2;
}
 

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