web-dev-qa-db-fra.com

Forcer l'orientation portrait tout en poussant à partir du paysage View Controller

Prise en charge de l'application: iOS6 +

Mon application fonctionne à la fois en portrait et en paysage. Mais 1 contrôleur ne devrait fonctionner que dans un portrait.

Le problème est que lorsque je suis en mode paysage et que je pousse le contrôleur de vue, le nouveau viewcontroller est également en mode paysage jusqu'à ce que je le fasse pivoter en mode portrait. Ensuite, il est coincé dans le portrait comme il se doit.

Est-il possible de toujours le faire apparaître en portrait? Même si son parent le pousse dans le paysage?

Tout le code suivant n'aide pas

[[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationPortrait];

Et ce code fonctionne jusqu'à ce que et à moins que je ne pousse pas du paysage Comment forcer un UIViewController à l'orientation Portrait dans iOS 6

30
Tariq

J'ai résolu cela en ajoutant les lignes suivantes dans ViewDidLoad

UIViewController *c = [[UIViewController alloc]init];
[self presentViewController:c animated:NO completion:nil];
[self dismissViewControllerAnimated:NO completion:nil];
31
Tariq

Tout d'abord, vous devez créer une catégorie:

UINavigationController + Rotation_IOS6.h

#import <UIKit/UIKit.h>

@interface UINavigationController (Rotation_IOS6)

@end

UINavigationController + Rotation_IOS6.m:

#import "UINavigationController+Rotation_IOS6.h"

@implementation UINavigationController (Rotation_IOS6)

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

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

@end

Ensuite, vous implémentez ces méthodes dans votre classe que vous souhaitez être uniquement en mode paysage:

- (BOOL)shouldAutorotate
{
    return YES;
}

- (NSUInteger)supportedInterfaceOrientations
{
    return UIInterfaceOrientationMaskLandscape;
}

Si vous utilisez un UITabBarController, remplacez simplement le UINavigationController pour UITabBarController. Cette solution a bien fonctionné pour moi après une longue recherche! J'étais dans la même situation que toi maintenant!

MODIFIER

J'ai donc vu votre échantillon. Vous devez apporter quelques modifications. 1 - Créez une nouvelle classe pour la catégorie UINavigationController. Nommez la classe UINavigationController + Rotation_IOS6 (.h et .m) 2 - Vous n'avez pas besoin d'implémenter la méthode preferredInterfaceOrientationForPresentation. Votre catégorie devrait ressembler à ceci:

#import "UINavigationController+Rotation_IOS6.h"

@implementation UINavigationController (Rotation_IOS6)

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

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

@end

3 - Dans la classe que vous souhaitez faire pivoter uniquement en mode paysage, incluez-la dans l'implémentation, exactement comme ceci:

// Rotation methods for iOS 6
- (BOOL)shouldAutorotate
{
    return YES;
}

- (NSUInteger)supportedInterfaceOrientations
{
    return UIInterfaceOrientationMaskLandscape;
}

4 - Je conseillerais d'inclure également la méthode d'autorotation pour iOS 5 dans la classe que vous souhaitez en paysage:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
    return UIInterfaceOrientationLandscapeLeft | UIInterfaceOrientationLandscapeRight;
}
3
CainaSouza