96 votes

Les orientations prises en charge n'ont pas d'orientation commune avec l'application, et shouldAutorotate renvoie YES'.

Mon application (iPad ; iOS 6) est une application en mode paysage uniquement, mais lorsque j'essaie d'utiliser un UIPopoverController pour afficher la photothèque, l'erreur suivante se produit : Supported orientations has no common orientation with the application, and shouldAutorotate is returning YES. J'ai essayé de modifier une grande partie du code mais je n'ai pas eu de chance.

1 votes

Vous devriez accepter une réponse. il y a beaucoup de gens pour l'aide et pour d'autres personnes qui ont le même problème il aide dehors quand vous marquez la réponse correcte pour votre problème !

1 votes

Non ! aucune solution ne fonctionne sur iOS 7 :( (headbang)

0 votes

Meilleure réponse ici stackoverflow.com/questions/20468335/

97voto

Snickers Points 996

Dans IOS6, vous avez pris en charge les orientations de l'interface à trois endroits :

  1. Le .plist (ou écran de résumé de la cible)
  2. Votre UIApplicationDelegate
  3. Le UIViewController qui est affiché.

Si vous obtenez cette erreur, c'est très probablement parce que la vue que vous chargez dans votre UIPopover ne prend en charge que le mode portrait. Cela peut être dû au Game Center, à iAd ou à votre propre vue.

S'il s'agit de votre propre vue, vous pouvez le corriger en surchargeant supportedInterfaceOrientations sur votre UIViewController :

- (NSUInteger) supportedInterfaceOrientations
{
     //Because your app is only landscape, your view controller for the view in your
     // popover needs to support only landscape
     return UIInterfaceOrientationMaskLandscapeLeft | UIInterfaceOrientationMaskLandscapeRight;
}

S'il ne s'agit pas de votre propre affichage (comme GameCenter sur l'iPhone), vous devez vous assurer que votre fichier .plist prend en charge le mode portrait. Vous devez également vous assurer que votre UIApplicationDelegate prend en charge les vues qui s'affichent en mode portrait. Pour ce faire, modifiez votre fichier .plist, puis remplacez l'option supportedInterfaceOrientation de votre UIApplicationDelegate :

- (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window
{
    return UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskLandscapeLeft | UIInterfaceOrientationMaskLandscapeRight;
}

3 votes

UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskLandscapeLeft | UIInterfaceOrientationMaskLandscapeRight est égal à UIInterfaceOrientationMaskAllButUpsideDown UIInterfaceOrientationMaskLandscapeLeft | UIInterfaceOrientationMaskLandscapeRight est égal à UIInterfaceOrientationMaskLandscape

4 votes

Ou utilisez simplement UIInterfaceOrientationMaskAll.

0 votes

Parfait. Même si un popover "portrait uniquement" fonctionne en mode paysage, il ne peut pas présenter un contrôleur de vue en mode paysage uniquement.

66voto

Dr.Luiji Points 1595

Après avoir passé beaucoup de temps à chercher un moyen d'éviter de sous-classer et d'ajouter une tonne de code, voici ma solution en une ligne de code.

Créer une nouvelle catégorie de UIImagePickerController et ajouter

-(BOOL)shouldAutorotate{
    return NO;
}

C'est tout, les amis !

1 votes

Cela a fonctionné pour moi aussi, je n'ai pas encore tout testé mais cela semble faire l'affaire jusqu'à présent.

2 votes

Cela semble être la meilleure solution.

2 votes

Ça marche ! C'est génial, et ça m'a vraiment aidé dans une situation difficile. Merci Dr Luiji !

43voto

JackPearse Points 1795

Il existe un autre cas où ce message d'erreur peut apparaître. J'ai cherché pendant des heures jusqu'à ce que je trouve le problème. Ce fil de discussion a été très utile après l'avoir lu plusieurs fois.

Si votre contrôleur de vue principal est tourné en orientation paysage et que vous invoquez un contrôleur de vue secondaire personnalisé qui devrait être affiché en orientation portrait, ce message d'erreur peut se produire lorsque votre code ressemble à ceci :

- (NSUInteger)supportedInterfaceOrientations {

    return UIInterfaceOrientationPortrait;
}

Le piège ici était que l'intellisense de xcode suggérait "UIInterfaceOrientationPortrait" et que je ne m'en souciais pas. A première vue, cela semblait correct.

Le masque de droite est nommé

UIInterfaceOrientationMaskPortrait

Attention au petit infixe "Masque" sinon votre sous-vue se retrouvera avec une exception et le message d'erreur mentionné ci-dessus.

Les nouveaux enums sont décalés en bits. Les anciens enums renvoient des valeurs invalides !

(dans UIApplication.h vous pouvez voir la nouvelle déclaration : UIInterfaceOrientationMaskPortrait = (1 << UIInterfaceOrientationPortrait) )

La solution est la suivante :

- (BOOL)shouldAutorotate {

    return YES;
}

- (NSUInteger)supportedInterfaceOrientations {

    // ATTENTION! Only return orientation MASK values
    // return UIInterfaceOrientationPortrait;

    return UIInterfaceOrientationMaskPortrait;
} 

En utilisation rapide

override func shouldAutorotate() -> Bool {

    return true
}

override func supportedInterfaceOrientations() -> Int {

    return Int(UIInterfaceOrientationMask.Portrait.rawValue)
}

5 votes

M'est arrivé pour la même raison

0 votes

J'aurais aimé qu'apple fasse simplement le type de retour UIInterfaceOrientationMask pour que ce qui doit être retourné soit un peu plus évident.

0 votes

La réponse de Jackpearse semble correcte. Mais quand on regarde dans le fichier info.plist, il y a UISupportedInterfaceOrientations avec UIInterfaceOrientationPortrait, UIInterfaceOrientationLandscapeLeft, UIInterfaceOrientationLandscapeRight. Non MASQUE ici

22voto

J'ai eu un problème similaire en présentant le sélecteur d'images dans une application en mode paysage uniquement. Comme suggéré par le Dr. Luiji's, j'ai ajouté la catégorie suivante au début de mon contrôleur.

// This category (i.e. class extension) is a workaround to get the
// Image PickerController to appear in landscape mode.
@interface UIImagePickerController(Nonrotating)
- (BOOL)shouldAutorotate;
@end

@implementation UIImagePickerController(Nonrotating)

- (BOOL)shouldAutorotate {
  return NO;
}
@end

Le plus simple est d'ajouter ces lignes juste avant l'implémentation @implementation de votre fichier ViewController .m.

0 votes

J'ai une application qui ne fonctionne qu'en mode portrait et je veux afficher l'appareil photo en mode paysage. Une solution ? ? ????

0 votes

Trausti n'a pas fonctionné ? J'ai le même problème et j'ai essayé votre code mais la même exception apparaît toujours *** Terminating app due to uncaught exception 'UIApplicationInvalidInterfaceOrientation', reason : 'Supported orientations has no common orientation with the application, and shouldAutorotate is returning YES........ j'ai aussi mis un point d'arrêt sur la méthode de catégorie UIimagePickerView shouldAutorotate atteignant là et retournant non mais donnant toujours cette exception .... Mon application n'est qu'un paysage... aidez-moi s'il vous plaît.

0 votes

Fonctionne également pour forcer SKStoreProductViewController à se présenter en portrait lorsque l'application entière est en paysage dans iOS 8. Je vous remercie.

11voto

Robby Points 98

Je rencontrais le même message d'erreur dans mon code. J'ai trouvé ceci, c'est un bug signalé par Apple :

https://devforums.apple.com/message/731764#731764

Sa solution consiste à corriger le problème dans l'AppDelegate. Je l'ai mise en œuvre et cela fonctionne pour moi !

0 votes

Au fait, j'ai trouvé ça à l'origine sur : stackoverflow.com/questions/12522491/

0 votes

C'était la bonne réponse, directement d'Apple, et il ne me restait plus qu'à suivre les mêmes instructions mais en Swift pour une application visant iOS 8. Tout fonctionne parfaitement. AppDelegate définit supportedInterfaceOrientationsForWindow à la fois sur Landscape et Portrait, chaque fichier Swift individuel définit override func supportedInterfaceOrientations sur Landscape seulement pour que la vue ne tourne pas, mais quand une vue Portrait (dans mon cas SKStoreProductViewController) doit être chargée, ça marche !

0 votes

Bon sang, il y a tellement de solutions proposées, et celle-ci n'a de loin pas les meilleurs points, mais c'est bien la bonne. Testé sur iOS 10 et 9. Rien d'autre ne fonctionne.

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