web-dev-qa-db-fra.com

problème de rotation iOS 6 - Pas de rotation du contrôleur de vue modale présenté

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

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

MainView Controller 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, cela se trouve dans les LaunchOptions:

[self.window setRootViewController:self.mainViewController];

Dans mon fichier app.plist, il prend en charge toutes les orientations. En effet, les autres vues doivent également prendre en charge le paysage. Donc, sur mon MainViewController et InfoViewController, je n'ai besoin que de Portrait et PortraitUpsideDown. Mais sur un autre point de vue, j'ai besoin de toutes les explications.

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

Je rencontre des difficultés extrêmes pour que cela fonctionne dans iOS6. J'ai fait des recherches sur d'autres postes et essayé l'assistance d'autres personnes, mais je n'ai pas eu de chance. S'il vous plaît quelqu'un peut m'aider à atteindre ce merci. Et je suis un novice Objective-C: p

16
ryryan

Ne supportez pas toutes les orientations de votre fichier plist d'applications, mais uniquement celles prises en charge par votre contrôleur de vue racine.

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

- (BOOL)shouldAutorotate {
    return YES;
}

- (NSUInteger)supportedInterfaceOrientations {
    return UIInterfaceOrientationMaskAllButUpsideDown;    
}

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

Vous pouvez laisser le contrôleur de vue qui présente votre contrôleur de vue modal l'informer de la rotation. De plus, vous utilisez maintenant: presentViewController:animated:completion: pour présenter le contrôleur de vue. presentModalViewController:animated: est obsolète que vous utilisez dans le code.

26
Hannes Sverrisson

J'ai résolu des problèmes similaires en utilisant un contrôleur de barre d'onglets. 

Sous-classe UITabBarController. Implémentez ces méthodes: 

- (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 contrôleurs de tabbarcontroller, dans chacun des contrôleurs de la barre de tabulation, implémentez également ces méthodes et écrivez du code pour gérer le changement d'orientation. Si vous ne voulez pas le gérer, vous n'avez pas besoin de mettre en œuvre ces méthodes. Les méthodes 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 méthodes shouldAutorotate. Je suis complètement passé au nouveau modèle d'orientation. Si vous voulez les faire rester, ce sera probablement plus difficile.

3
wzbozon

ajouter ce code sur la sous-classe 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/expérience dans le contrôleur de barre d'onglets avec rotations: http://luterr.blogspot.sg/2015/04/example-code-uiinterfaceoracementmask.html

0
Luter Rinding

Créez une catégorie en sous-classant UINavigationController et implémentez les méthodes suivantes Dans le fichier .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 implémenter les méthodes suivantes dans la classe de contrôleur de vue, la classe u veut activer la rotation

-(NSUInteger)supportedInterfaceOrientations
{
return (UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskLandscapeLeft |   UIInterfaceOrientationMaskLandscapeRight | UIInterfaceOrientationMaskPortraitUpsideDown);
 }


- (BOOL)shouldAutorotate
{
return YES;
}
- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
{
   return UIInterfaceOrientationLandscapeLeft;
}
0
Alok SInha