2010-05-19 8 views
18

J'ai écrit ma demande universelle en mode portrait, et maintenant au bout de 15 fichiers nib, beaucoup, beaucoup viewCotnrollers, je voudrais mettre en œuvre le shouldAutorotateToInterfaceOrientation et concevoir des écrans en mode paysage.shouldAutorotateToInterfaceOrientation ne fonctionne pas

ajouter:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { 
return YES; 
} 

à tous mes viewControllers, ne fait pas le travail. Pendant le débogage, je vois que cette méthode est appelée, mais ça ne marchera pas! pas dans le simulateur, pas dans l'appareil, pas dans Iphone, pas dans Ipad!

J'ai cherché des réponses dans le forum, et a vu quelques-uns conseille d'utiliser:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { 
return (interfaceOrientation == UIInterfaceOrientationPortrait || 
    interfaceOrientation == UIInterfaceOrientationLandscapeLeft || 
    interfaceOrientation == UIInterfaceOrientationLandscapeRight || 
    interfaceOrientation == UIInterfaceOrientationPortraitUpsideDown); 
} 

N'a pas fonctionné non plus,

ajouter:

[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications]; 

et

[[UIDevice currentDevice] endGeneratingDeviceOrientationNotifications]; 

à ma vueDidLo respectivement ad et viewDidUnload n'ont pas fonctionné non plus.

Je suis perdu .. Toute aide fera l'affaire!

juste une autre info ... toutes mes vues sont de type UIControl, car j'avais besoin du TuchUpInside pour fonctionner.

Appréciez votre aide.

+0

Sur quels périphériques et/ou versions de simulateur voyez-vous cela? Quel est le type de votre contrôleur de navigation racine ou de barre d'onglets? – warrenm

+0

Xcode 3.2.2, iphone simulator 3.1.3, (ipad 3.2) et en utilisant le périphérique 3.1.3 ainsi. J'ai les deux barre d'onglets et le contrôleur de navigation dans mon fichier Nib MainWindow. mais toutes mes classes sont des sous-classes de UIViewController –

+0

quelqu'un? quelque chose? –

Répondre

44

Assurez-vous que toutes vos vues parents ont autoresizesSubviews = YES. Vous devrez peut-être le faire dans le code si vous n'avez pas défini les ressorts et les entretoises dans IB pour toutes vos vues.

Citant le Guide d'Interface Builder utilisateur:

Important: Dans un fichier nib Cocoa, si vous ne définissez pas de ressorts ou entretoises pour votre point de vue dans Interface Builder, mais alors ne pas utiliser le setAutoresizingMask: méthode pour ajouter un comportement autosizing au runtime, votre vue peut toujours pas afficher le bon comportement autoresizing . La raison en est que l'interface Builder désactive complètement l'auto-édition d'un enfant parent vue si ces enfants n'ont pas de ressorts et Struts ensemble. Pour activer à nouveau le comportement à numérotation automatique, vous devez transmettre YES à la méthode setAutoresizesSubviews: la vue parente. Ce faisant, les vues enfant doivent être automatiquement numérisées correctement.

Un couple d'autres choses à connaître:

  1. Un UINavigationController n'autorotation si son contrôleur de vue racine est également mis à autorotation.Un UITabBarController effectuera une autorotation uniquement si tous ses contrôleurs de vue sont réglés sur autorotate.

+4

"Un UITabBarController autorotera uniquement si tous ses contrôleurs de vue sont réglés sur autorotate." --- me reçoit à chaque fois; c'est tout simplement la mauvaise façon pour Apple d'implémenter l'API. J'espère qu'ils vont le réparer un jour. – Adam

+0

+ 1 ceci expliquera de manière concise et complète le comportement personnalisé à quiconque fait une "application normale" avec les contrôleurs de navigation et de tabulation - cela a fonctionné pour moi et cela fonctionne. En remarque, une application construite avec des navcontrollers dans une barre d'onglets dans IB obtiendra le bon rootcontroller, et les paramètres par défaut struts, autosize, et view d'orientation lors de la création des viewcontrollers sont corrects, donc pas besoin de les corriger. –

+0

"Un UITabBarController autorotera uniquement si tous ses contrôleurs de vue sont réglés sur autorotate." !!!! (ours répète :). On dirait que ce n'est peut-être pas le cas pour iOS 6 et supérieur, mais pour iOS 5 (était très confus par le comportement). –

2
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 
{ 
    UIInterfaceOrientation des=self.interfaceOrientation; 

    if(UI_USER_INTERFACE_IDIOM()==UIUserInterfaceIdiomPad) //iPad 
    { 
     if(des==UIInterfaceOrientationPortrait||des==UIInterfaceOrientationPortraitUpsideDown)//ipad-portairait 
     { 

     } 
     else//ipad -landscape 
     { 

     } 
    } 
    else//iphone 
    { 
     UIInterfaceOrientation des=self.interfaceOrientation; 

     if(des==UIInterfaceOrientationPortrait||des==UIInterfaceOrientationPortraitUpsideDown) //iphone portrait 
     { 

     } 
     else //iphone -landscape 
     { 

     } 
    } 
return YES; 
} 
+0

Je vous remercie pour l'édition. –

0

J'ai eu ce problème, mais cela a fonctionné dans iOS6 mais pas iOS5. Il s'avère que j'avais un point de vue dans mon storyboard que je n'avais pas encore fait de classe de viewcontroller.

0

... et last but not least, assurez-vous que vous n'avez pas activé le paramètre "Portrait Orientation Locked" sur votre appareil de test (bien sûr ne s'applique pas au simulateur), cela désactivera la rotation dans n'importe quelle application peu importe ce que shouldAutorotateToInterfaceOrientation retourne.

1

Pour quel iOS construisez-vous? Il était obsolète dans iOS 6.0. (Vous devez remplacer les supportedInterfaceOrientations et méthodes preferredInterfaceOrientationForPresentation à la place.)

vous pouvez également appeler shouldAutorotate sur la classe UIViewController:

https://developer.apple.com/library/ios/documentation/uikit/reference/UIViewController_Class/Reference/Reference.html#//apple_ref/occ/instm/UIViewController/shouldAutorotate


Vérifiez que vous avez vérifié les orientations d'interface pris en charge dans le « Estival "onglet des paramètres du projet (Sélectionnez le nom du projet dans le 'Project Navigator' tout en haut).

Si vous n'avez pas sélectionné les orientations que vous souhaitez utiliser ici, le simulateur/iphone ne permettra pas à l'écran de changer d'orientation.