36 votes

Rotations iOS 6: supportéInterfaceOrientations ne fonctionne pas?

Im avoir ce problème avec le kit SDK d'iOS 6: Im avoir quelques points de vue qui devrait être autorisé à tourner (par exemple, un videoview), et certains qui ne. Maintenant, je comprends, je dois vérifier toutes les orientations dans les applications d'Info.plist et puis trier dans chaque ViewController, ce qui devrait arriver. Mais il ne marche pas! L'application tourne orientations, qui sont donnés dans l'Info.plist.

Info.plist:

<key>UISupportedInterfaceOrientations</key>
    <array>
        <string>UIInterfaceOrientationPortrait</string>
        <string>UIInterfaceOrientationLandscapeLeft</string>
        <string>UIInterfaceOrientationLandscapeRight</string>
    </array>

tout ViewController qui ne devrait pas être autorisé à tourner:

//deprecated
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
return (interfaceOrientation == UIInterfaceOrientationPortrait);
}

- (NSUInteger)supportedInterfaceOrientations{
return UIInterfaceOrientationMaskPortrait;
}

Observation: App tourne à l'orientation portrait ou paysage. Des idées pourquoi ou ce que je fais de mal?

Cheers, Marc

Edit: Mes derniers résultats indiquent également que si vous voulez avoir une rotation à un certain moment dans votre application, vous avez d'activer tous les quatre directions de rotation dans les paramètres de votre projet ou de l'Info.plist. Une alternative est de remplacer

- (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window

dans votre AppDelegate, qui remplace l'Info.plist. Il n'est pas possible de définir uniquement le Portrait de votre Info.plist et puis d'avoir la rotation dans certains ViewController en substituant shouldAutorotateToInterfaceOrientation ou supportedInterfaceOrientations.

31voto

CSmith Points 6083

Si votre ViewController est un enfant d'un UINavigationController ou d'un UITabBarController, c'est le parent qui vous pose problème. Vous devrez peut-être sous-classer ce contrôleur de vue parent, en remplaçant simplement ces méthodes InterfaceOrientation comme vous l'avez montré dans votre question.

MODIFIER:

Exemple pour portrait uniquement TabBarController

            @interface MyTabBarController : UITabBarController
            {
            }
            @end

            @implementation MyTabBarController

            // put your shouldAutorotateToInterfaceOrientation and other overrides here        
            - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
                return (interfaceOrientation == UIInterfaceOrientationPortrait);
            }

            - (NSUInteger)supportedInterfaceOrientations{ 
                return UIInterfaceOrientationMaskPortrait; 
            } 

        @end
 

27voto

Evan Schoenberg Points 543

En ajoutant à la réponse de CSmith ci-dessus, le code suivant dans une sous-classe UINavigationController permet la délégation au contrôleur de la vue de dessus de la manière que je pensais que cela fonctionnerait en premier lieu:

 - (BOOL)shouldAutorotate;
{
    return YES;
}

- (NSUInteger)supportedInterfaceOrientations
{
    if ([[self topViewController] respondsToSelector:@selector(supportedInterfaceOrientations)])
        return [[self topViewController] supportedInterfaceOrientations];
    else
        return [super supportedInterfaceOrientations];
}
 

8voto

Glenn Schmidt Points 126

Voici une autre alternative à l'approche de CSmith.

Si vous souhaitez reproduire le comportement antérieur à iOS 6 lorsque toutes les vues de la pile de navigation / la barre d'onglets doivent s'accorder sur un ensemble d'orientations autorisé, indiquez-le dans votre sous-classe de UITabBarController ou UINavigationController :

 - (NSUInteger)supportedInterfaceOrientations
{
    NSUInteger orientations = [super supportedInterfaceOrientations];

    for (UIViewController *controller in self.viewControllers)
        orientations = orientations & [controller supportedInterfaceOrientations];

    return orientations;
}
 

2voto

Shimanski Artem Points 804

Essayez d'ajouter cette catégorie:

 @interface UINavigationController(InterfaceOrientation)

@end

@implementation UINavigationController(InterfaceOrientation)

- (NSUInteger) supportedInterfaceOrientations {
    if (self.viewControllers.count > 0)
        return [[self.viewControllers objectAtIndex:0] supportedInterfaceOrientations];
    else
        return UIInterfaceOrientationMaskAll;
}

@end
 

0voto

Nagaraj Points 348

Référer cette question:

iOS6: supportéInterfaceOrientations ne fonctionne pas (est invoqué mais l'interface tourne toujours)

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