web-dev-qa-db-fra.com

pourquoi l'iPhone 5 ne tourne pas à l'envers

j'ai ajouté les nouvelles méthodes à mon code, comme décrit dans Apple 6 Documentations, mais sur l'iPhone 5, l'application ne tourne pas à l'envers. Seul le paysage Ways. 

Voici mon code de rootViewController:

- (NSUInteger)supportedInterfaceOrientations{
    NSLog(@">>> Entering %s <<<", __PRETTY_FUNCTION__);
    return (UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskLandscapeLeft |
            UIInterfaceOrientationMaskLandscapeRight | UIInterfaceOrientationMaskPortraitUpsideDown);
}
- (BOOL)shouldAutorotate{
    NSLog(@">>> Entering %s <<<", __PRETTY_FUNCTION__);
    return YES;
}

j'ai aussi essayé "UIInterfaceOrientationMaskAll" mais aucune modification. The Strange is, mon iPhone 4 avec iOS6 ne se met pas à l'envers avec le même code. 

Des idées?

25
Jeanette Müller

IOS 6 utilise l'orientation par défaut UIInterfaceOrientationMaskAllpour iPad et UIInterfaceOrientationMaskAllButUpsideDownpour iPhone. Si vous souhaitez que vos ViewControllers sur l'iPhone pivotent vers TOUTES les orientations, y compris UpsideDown, vous devez ajouter la méthode iOS 6:

-(NSUInteger)supportedInterfaceOrientations
{
    return UIInterfaceOrientationMaskAll;
}

à tous les contrôleurs de vue. Si vous avez fait cela et que cela ne fonctionne pas, je parie que vous utilisez un TabViewController ou un NavigationController où certaines des vues NE renvoient PAS cela. Tous les ViewControllers doivent renvoyer ceci pour TOUS d’eux pour le supporter.

Vous pouvez également ajouter une catégorie à la classe UITabViewController ou NavigationController qui est votre rootViewController et substituer cette méthode. Vous faites ça comme ça:

@interface UITabBarController (RotationAll)
    -(NSUInteger)supportedInterfaceOrientations;
@end

@implementation UITabBarController (RotationAll)
-(NSUInteger)supportedInterfaceOrientations {
    return UIInterfaceOrientationMaskAll;
}
@end

Ce sont également les approches actuellement recommandées qui sont actuellement discutées dans les forums de développeurs Apple, le personnel d’Apple déclarant que la documentation antérieure qui déconseillait la sous-classification de UINavigationController est obsolète et qu’à partir d’iOS 6, il est acceptable de le faire.

61
Cliff Ribaudo

Merci à Cliff Ribaudo vraiment aider votre réponse pour un projet basé UITabbarController mais dans mon cas, je n’utilise que UINavigationController, j’ai donc modifié votre réponse pour UINavigationController categeory.

@interface UINavigationController (RotationAll)
-(NSUInteger)supportedInterfaceOrientations;
@end   


@implementation UINavigationController (RotationAll)
  -(NSUInteger)supportedInterfaceOrientations {
    return UIInterfaceOrientationMaskAll;
  }
@end
12
Chandan

Les paramètres de cible par défaut ne sont pas orientés à l'envers, essayez ceci:

Allez au fichier de projet Sélectionnez la cible de votre application Sélectionnez l'onglet "Summery" Vérifiez que tous les types d'orientation ont été activés.

Bonne chance :)

0
avishic

Si vous envisagez d'activer ou de désactiver la rotation pour tous les contrôleurs de vue, vous n'avez pas besoin de sous-classer UINavigationController. À la place, utilisez:

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

dans votre AppDelegate.

Si vous envisagez de prendre en charge toutes les orientations de votre application, mais différentes sur les contrôleurs de vue PARENT (pile UINavigationController par exemple), vous devez utiliser

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

depuis AppDelegate en combinaison avec les méthodes suivantes dans votre PARENT View Controller.

    - (BOOL)shouldAutorotate

et

- (NSUInteger)supportedInterfaceOrientations

Toutefois, si vous prévoyez d'avoir différents paramètres d'orientation dans différents ViewControllers ENFANTS dans la même pile de navigation (comme moi), vous devez vérifier le ViewController actuel dans la pile de navigation.

J'ai créé les éléments suivants dans ma sous-classe UINavigationController:

    - (BOOL)shouldAutorotate
{
    return YES;
}

- (NSUInteger)supportedInterfaceOrientations
{
    int interfaceOrientation = 0;

    if (self.viewControllers.count > 0)
    {
        id viewController;
        DLog(@"%@", self.viewControllers);
        for (viewController in self.viewControllers)
        {
            if ([viewController isKindOfClass:([InitialUseViewController class])])
            {
                 interfaceOrientation = UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskPortraitUpsideDown;
            }
            else if ([viewController isKindOfClass:([MainViewController class])])
            {
                 interfaceOrientation = UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskPortraitUpsideDown;
            }
            else
            {
                 interfaceOrientation = UIInterfaceOrientationMaskAllButUpsideDown;
            }
        }
    }
    return interfaceOrientation;
}

Comme vous ne pouvez plus contrôler d'enfants ViewControllers les paramètres de rotation du contrôleur de vue présenté, vous devez intercepter quel que soit le contrôleur de vue présentement dans la pile de navigation. Donc c'est ce que j'ai fait :). J'espère que cela pourra aider !

0
Razvan

Pardonnez la verbosité, mais je pense que votre réponse est ci-dessous.

J'avais le même problème, mais il se produisait sur tous les IOS 6, y compris mon iPhone 4. La lecture de votre question répondait à la mienne. Je l'avais enlevé il y a longtemps car il ne faisait rien:

- (NSUInteger)supportedInterfaceOrientations{    
    NSLog(@">>> Entering %s <<<", __PRETTY_FUNCTION__);
    return (UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskLandscapeLeft |
            UIInterfaceOrientationMaskLandscapeRight | UIInterfaceOrientationMaskPortraitUpsideDown); }

et mon code fonctionnait parfaitement dans les versions antérieures d'ios. Il semble que cela soit devenu obligatoire dans iOS 6, mais seulement pour upsideDown. Les autres orientations fonctionnaient bien.

Alors merci.

Revenons à ton problème. Avez-vous examiné la cible de votre projet pour voir si toutes les "Orientations d'interface prises en charge" sont en gris foncé? Je me demande si la tête en bas est gris clair (c'est-à-dire non contrôlée). J'ai découvert dans un test rapide que celles-ci étaient également ignorées dans les versions antérieures d'ios. Tant que vous renvoyez OUI de shouldAutorotateToInterfaceOrientation, il prendra en charge les orientations, mais pas dans iOS 6.

Enfin, vous avez implémenté shouldAutorotate, que je n'ai pas dans mon code. Je pense que cette valeur par défaut est Oui. Et je pense que cela indique simplement au système d’essayer d’essayer de faire la rotation, mais ensuite vous devez lui indiquer les orientations que vous soutenez avec shouldAutorotateToInterfaceOrientation. Mais votre extrait ne montre pas que vous avez implémenté devraitAutorotateToInterfaceOrientation. Je suggérerais de mettre cela en œuvre car cela indique au système d’exploitation quelles orientations vous appuyez pour renvoyer un simple OUI signifie que vous acceptez tout.

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
    // Return YES for supported orientations.
    //return (interfaceOrientation == UIInterfaceOrientationPortrait);
    return YES;
}

J'espère que cela t'aides.

0
krason