shouldAutorotateToInterfaceOrientation pas être appelé dans iOS 6
Je suis en utilisant MGSplitViewController et je suis en utilisantshouldAutorotateToInterfaceOrientation
pour contrôler la taille de la base de-vue-contrôleur de rotation.
Ça fonctionne bien sur iOS 5, iOS 6 (les deux simulateur et iPad) shouldAutorotateToInterfaceOrientation
n'est jamais appelée.
Est-ce un bug que je devrais attendre pour être fixé à la sortie de la version finale de l'iOS 6 ou quelque chose que je ne suis pas au courant de qui a changé?
- La caisse de nice solution
Vous devez vous connecter pour publier un commentaire.
VEUILLEZ LIRE ATTENTIVEMENT ce ou vous pourriez perdre de 1 à 2 jours de votre vie avec des noix et des combats, en secouant, en tournant le dispositif de test comme le chimpanzé du zoo, qui a attrapé un visiteur mobile! Tôt ou tard...promis 🙂
DANS iOS 6
est obsolète et remplacé par
cela signifie iOS 6 n'appellerai jamais
shouldAutorotateToInterfaceOrientation
:donc, si vous avez utilisé les éléments suivants dans votre demande
AVANT iOS6 (iOS5,iOS4, etc.)
vous devez utiliser
APRÈS iOS 6+
ÊTRE CONSCIENT
UIInterfaceOrientation
est une propriété deUIApplication
et ne contient que 4 possibilités qui correspondent à l'orientation de la barre d'état:NE PAS CONFONDRE AVEC
UIDeviceOrientation
qui est une propriété de laUIDevice
classe, et contient 7 valeurs possibles:même, vous pouvez théoriquement utiliser
UIDeviceOrientation orientation = [[UIDevice currentDevice] orientation];
qui renvoieUIDeviceOrientation
- l'appareil réelle orientation - MAIS vous devez savoir queUIDeviceOrientation
n'est pas toujours égaleUIInterfaceOrientation
!!! Par exemple, lorsque votre appareil est sur une simple table, vous pouvez recevoir la valeur inattendue.Vous pouvez utiliser
UIInterfaceOrientation orientation = self.interfaceOrientation;
trop qui renvoieUIInterfaceOrientation
, l'orientation actuelle de l'interface, MAIS c'est une propriété deUIViewController
, de sorte que vous pouvez accéder à celui-ci seulement dansUIViewController
classes.Si vous souhaitez soutenir à la fois avant iOS6 (iOS3/4/5) et iOS6 périphériques - qui pourrait être évidente - il suffit d'utiliser les deux
shouldAutorotateToInterfaceOrientation:
etshouldAutorotate
dans votre code.À partir d'iOS 6 il y a 3 niveaux et 3 mesures que le dispositif de contrôle pendant le lancement de l'app, qui vous avez à contrôler si vous le souhaitez.
que vous pourriez graphiquement dans l'onglet Résumé. La séquence de permis à des orientations est IMPORTANT, que vous pouvez modifier manuellement en modifiant le
info.plist
, et l'appareil va choisir la première lorsque l'application est lancé! C'est critique car le problème est toujours le lancement de l'app quand il y a le risque que le[UIDevice currentDevice].orientation
est inconnu, surtout quand nous de tester notre application sur une surface plane.ÊTRE CONSCIENT
Il y a deux autres paramètres de possibilité avec (iPad) ou (iPhone) extension, si vous utilisez l'un d'entre eux, il va utiliser le réglage de l'appareil ou de simulateur et de négliger les paramètres généraux sans l'extension. Donc, si vous exécutez un iPhone seule application et accidentellement vous avez quitté une "prise en charge de l'Interface Orientations (iPad)" la ligne quelque part dans le plist même sans données, il va négliger les règles que vous avez créé plus tôt dans les paramètres généraux (dans mon exemple pour l'iPhone) et vous pourriez obtenir un rejet de votre Application avec un texte "Nous avons constaté que votre application ne répond pas aux exigences pour la course sur iPad...", même si votre application n'a pas l'intention d'utiliser une orientation sur l'iPhone, mais l'iPad va l'utiliser ce qui pourrait provoquer des erreurs imprévisibles, comme toutes les applications de l'iPhone à exécuter sur iPad pendant le processus de soumission.
retour d'un masque de bits liste de toutes les orientations que vous souhaitez autoriser, de façon à remplacer l'info.plist paramètres.C'est convoquée au moins une fois chaque fois que l'appareil tourne.
qui donne une intersection avec l'ensemble de l'application et délégué d'application, qui a pas un zéro pour éviter le crash. C'est convoquée au moins une fois chaque fois que l'appareil tourne, sauf il y a une autre méthode installé dans notre contrôleur:
qui interfère avec l'app permis orientations, et donne un
BOOL
par défautYES
.comme le premier contrôleur dans votre
AppDelegate
, comme ceci:dans ce cas, vous devez placer le code suivant dans votre
AppDelegate
comme une catégorie d'attachement àNavigationController
classe, comme c'est le premier contrôleur, et si vous n'avez pas fait une sous-catégorie, vous n'avez pas de place/code où vous pouvez configurer ses paramètres d'orientation, de sorte que vous besoin de forcer pour vérifier votre véritablerootViewController
dans ce cas, ledetailViewController
pour les orientations:après cela, vous pouvez définir les orientations privilégiées dans votre "niveau supérieur"
ViewController
(dans mon exemple c'est ledetailViewController
) avec l'une des méthodes que vous avez disponible dans iOS 6 pourViewControllers
, comme ci-dessous:Ok, je l'ai eu à travailler dans iOS6 iPad Simulateur. Yay. Voici ce que j'ai fait:
Je viens de vous montrer avant et après, il doit être auto-explicatif:
AVANT
APRÈS
Que pour les prises en charge de l'orientation, vous pouvez spécifier dans l'info.plist en tant que tel:
Ou utilisez le code:
Edit: À la réflexion, si vous prévoyez de soutien versions inférieures (iOS4.3/5/5.1) ainsi que 6.0 alors il suffit d'inclure les deux méthodes avec le même code de contenu. Fonctionne pour moi (en sim de toute façon)
[[UIDevice currentDevice] orientation]
...UIDeviceOrientation
n'est pas la même chose queUIInterfaceOrientation
.if (orientation == UIDeviceOrientationUnknown)
Réglage de la fenêtre d'application itinéraire contrôleur plutôt que, tout en ajoutant qu'il est vue comme une sous-vue a fonctionné pour moi (comme Rocotilos n')
Single View Application
. Le modèle deAppDelegate
contient déjà la ligne que vous êtes en train de suggérer. Ensuite, remplacershouldAutorotateToInterfaceOrientation
dans leViewController
, définissez un point d'arrêt et le débogage. Le point d'arrêt ne sera jamais frappé (iOS 6).Voici une solution pour iOS 5 et les versions antérieures de code qui n'implique pas de duplication de votre logique. Simplement ajouter ce code à votre vue-contrôleur et il génère le supportedInterfaceOrientations de votre shouldAutorotateToInterfaceOrientation méthode.
Une solution rapide pour moi, c'était pour ajouter ce code sur ma racine-vue-contrôleur
De cette façon, j'ai toujours utiliser la même logique pour les versions antérieures à iOS 6. Bien sûr, au départ, j'avais mis mon rootViewController dans mon application délégués didFinishLaunchingWithOptions correctement au lieu de simplement ajouter de la windows des sous-vues.
Et si un certain nombre de réponses ont la solution indiquée -- qu'à la mise en œuvre shouldAutorotate et supportedInterfaceOrientations pour iOS 6 s'appuie -- vous devriez aussi être conscient que si votre vue-contrôleur est hébergé dans une manette de navigation puis rien de tout cela n'aura d'importance depuis le runtime d'appel sur le UINavigationController instance et d'ignorer votre code autrement.
Apparemment, la "solution" est de la sous-classe UINavigationController et de mettre en œuvre ces nouvelles méthodes sur cette sous-classe comme décrit ici:
iOS 6 UITabBarController pris en charge l'orientation actuelle UINavigation contrôleur
Et ensuite vous aurez le plaisir de changer tout votre code lorsque vous utilisez un UINavigationController utilisation de cette nouvelle sous-classe de la place.
Ce doit être l'une des plus inutiles et ennuyeux de la rupture des changements dans une version d'iOS que j'ai jamais vu.
IOS 5
IOS 6
Cela a fonctionné pour moi avec iOS6 et Xcode 4.5 GM:
Sur AppDelegate.m
sur ViewController:
Voici une citation d'Apple, iOS SDK, XCode4.5+ (voir UIViewController Classe de Référence, de la Manipulation de Vue Rotations):
Également dans iOS6, shouldAutorotateToInterfaceOrientation: méthode de classe UIViewController est déjà obsolète.
Donc dans la racine de votre vue-contrôleur, vous ne le ff:
Btw, "root-vue-contrôleur" est une sous-classe UIViewController vous définissez comme rootViewController de votre appDelegate de fenêtre objet. On le fait dans l'appDelegate de application:didFinishLaunchingWithOptions: méthode.
À l'aide de UINavigationController en tant que root VC, la caisse Vladimir répondre.
En réponse à @Rocotilos, j'ai un additif qui s'est produite dans mon code que je n'ai pas vu ailleurs dans les forums. J'ai couru dans une situation où, au tout début de l'application du cycle de vie, où l'orientation n'était pas connu dans le shouldAutorotate méthode. Cela a été l'origine de l'application pour ne pas afficher l'afficher correctement dans le paysage. Après quelques rotations dans le simulateur, il a été fonctionne correctement.
Mon scénario est qu'il y a certains points de vue que d'obtenir sauté sur l'endroit où nous voulons paysage de mise en page. En tant que tel, nous ne voulons pas shouldAutorotate de retour OUI. Je réalise que j'ai peut-être un cas rare pour certains, mais j'ai passé beaucoup de temps au diagnostic et ont voulu transmettre. Espérons que cela est utile.
Il s'avère que seule la vue de la racine de poignées de ces appels. Dans mon cas, c'était normal UINavigationController. J'ai dû le changer pour un sous-classé fichier dans lequel j'ai ajouté les méthodes.
Dans mon cas, je voulais seulement la vue de la racine de portrait, et le reste portrait + paysage.
Appdelegate.h
Et la S2MBookAppNavController (sous-classe de UINavigationController)
Mise à JOUR:
Lorsque vous voulez forcer l'orientation (en poussant un nouveau point de vue sur la valeur liquidative du contrôleur d'essayer.
Faire de votre UINavigationController également son propre délégué:
Et dans le .m fichier
Oui, le problème est que la fenêtre.rootViewController méthode appelée pour retourner orientation masque.
Donc supportedInterfaceOrientations méthode doit être mis en œuvre dans le viewController qui est défini comme la fenêtre.rootViewController. Mais dans la plupart des cas, cet objet n'est pas de classe personnalisée, par exemple UINavigationController. Une solution possible est de la sous-classe UINavigationController. Mais Apple a dit: "Cette classe n'est pas prévu pour le sous-classement", donc j'aurais plutôt utilisé un autre UIViewController pour gérer les orientations et ajouté UINavigationController de l'enfant.
et dans MyRootViewController mettre en œuvre des méthodes:
J'ai une série de vue des contrôleurs dans un UINavigationController, dont l'un a dû être paysage uniquement. Je l'ai fixée par dérivation de l'UINavigationController et en ajoutant le code suivant:
Cela garantit que le premier-vue-contrôleur dicte l'orientation.
Il y a une chasse aux sorcières, même si: si vous vous déplacez d'un vc qui est limitée à un paysage qui prend en charge n'importe quelle orientation, la nouvelle vue affiche en mode paysage, indépendamment de l'orientation du téléphone.
Pour lutter contre cela, j'ai mis le code suivant dans l'illimité viewControllers:
Les notes sous la rubrique UIKit ici: http://developer.apple.com/library/ios/#releasenotes/General/RN-iOSSDK-6_0/_index.html%23//apple_ref/doc/uid/TP40012166-CH1-SW19 donner quelques indices pour la réponse, mais il n'est pas l'ensemble de l'image. Je n'ai pas l'image en entier, mais voici ce que j'ai trouvé à ce jour pour iOS 6.0 RTM.
Si vous n'êtes pas vraiment limitant les prises en charge des orientations et, au lieu de cela, vous êtes désireux de faire quelque chose parce que l'utilisateur fait pivoter l'appareil, puis vous pouvez déplacer la logique dans
à
à la place.
Ce qui peut probablement être un remplacement direct, mais je ne l'ai pas testé en bas niveau les versions d'iOS encore.
Si vous voulez limiter les prises en charge des orientations, il faut le faire à la
UIApplicationDelegate
niveau avecLa documentation précise que "Le système détermine si une orientation est prise en charge par l'intersection de la valeur renvoyée par l'application
supportedInterfaceOrientationsForWindow:
méthode avec la valeur retournée par la supportedInterfaceOrientations méthode de la plus haute pleine contrôleur de l'écran." mais dans l'expérimentation, j'ai trouvé que le système ignore mon point de vue, les contrôleurs pris en chargevaleur de retour, même si la méthode est appelée.
Apple a retiré de shouldautorate méthode de ios6 l'utilisation de ces méthodes à la place. Voir votre xcode docs
Son Travail pour moi:
orientations: