J'ai une application dans laquelle je voudrais prendre en charge la rotation de l'appareil dans certaines vues, mais d'autres n'ont pas particulièrement de sens en mode Paysage, donc lorsque j'échange les vues, je voudrais forcer la rotation à être définie sur portrait.
Il y a un setter de propriété non documenté sur UIDevice qui fait l'affaire mais génère évidemment un avertissement du compilateur et pourrait disparaître avec une future révision du SDK.
[[UIDevice currentDevice] setOrientation:UIInterfaceOrientationPortrait];
Existe-t-il des moyens documentés pour forcer l'orientation?
Mise à jour: J'ai pensé que je fournirais un exemple car je ne recherche pas shouldAutorotateToInterfaceOrientation car je l'ai déjà implémenté.
Je veux que mon application prenne en charge le paysage et le portrait dans la vue 1, mais uniquement le portrait dans la vue 2. J'ai déjà implémenté shouldAutorotateToInterfaceOrientation pour toutes les vues, mais si l'utilisateur est en mode paysage dans la vue 1 et passe ensuite à la vue 2, je veux forcer la téléphone pour revenir à Portrait.
la source
Réponses:
Ce n'est plus un problème sur le dernier SDK iPhone 3.1.2. Il semble maintenant respecter l'orientation demandée de la vue repoussée sur la pile. Cela signifie probablement que vous devrez détecter les anciennes versions de l'iPhone OS et n'appliquer setOrientation que lorsqu'il est antérieur à la dernière version.
Il n'est pas clair si l'analyse statique d'Apple comprendra que vous contournez les anciennes limitations du SDK. Personnellement, Apple m'a demandé de supprimer l'appel de méthode lors de ma prochaine mise à jour, je ne suis donc pas encore sûr que le piratage d'appareils plus anciens passera par le processus d'approbation.
la source
C'est longtemps après les faits, mais juste au cas où quelqu'un viendrait sans utiliser de contrôleur de navigation et / ou ne souhaitant pas utiliser de méthodes non documentées:
Il suffit de présenter et de rejeter un contrôleur de vue vanille.
De toute évidence, vous devrez toujours confirmer ou refuser l'orientation dans votre remplacement de shouldAutorotateToInterfaceOrientation. Mais cela entraînera le rappel de shouldAutorotate ... par le système.
la source
Si vous voulez le forcer à pivoter de portrait en paysage, voici le code. Notez simplement que vous devez ajuster le centre de votre vue. J'ai remarqué que la mienne ne plaçait pas la vue au bon endroit. Sinon, cela fonctionnait parfaitement. Merci pour le conseil.
la source
CGAffineTransformMakeRotation
faire pivoter la vue mais l'UIAlertView toujours selon l'orientation de la barre d'état, c'est-à-dire -degreeToRadian (angle)? Avez-vous quelque chose comme ça?UIAlertView
est de définir votre contrôleur de vue comme délégué d'alertView, puis sur le:,- (void) didPresentAlertView:(UIAlertView *) alertView
vous effectuez la rotation en fonction de la valeur actuelle[UIApplication sharedApplication].statusBarOrientation
. Si vous ne l'animez pas, ne devrait pas avoir l'air trop bizarre.D'après ce que je peux dire, la
setOrientation:
méthode ne fonctionne pas (ou peut-être ne fonctionne plus). Voici ce que je fais pour faire ceci:tout d'abord, placez cette définition en haut de votre fichier, juste sous vos #imports:
puis, dans la
viewWillAppear:
méthodesi vous voulez que cela soit animé, vous pouvez envelopper le tout dans un bloc d'animation, comme ceci:
Ensuite, dans votre contrôleur de mode portrait, vous pouvez faire l'inverse - vérifiez s'il est actuellement en mode paysage, et si c'est le cas, faites-le pivoter vers Portrait.
la source
J'avais un problème où j'avais un
UIViewController
à l'écran, dans unUINavigationController
, en orientation paysage. Cependant, lorsque le contrôleur de vue suivant est poussé dans le flux, j'avais besoin que l'appareil revienne en orientation portrait.Ce que j'ai remarqué, c'est que la
shouldAutorotateToInterfaceOrientation:
méthode n'est pas appelée lorsqu'un nouveau contrôleur de vue est poussé sur la pile, mais qu'elle est appelée lorsqu'un contrôleur de vue est sorti de la pile .Profitant de cela, j'utilise cet extrait de code dans l'une de mes applications:
Fondamentalement, en créant un contrôleur de vue vide, en le poussant sur la pile et en le faisant sauter immédiatement, il est possible que l'interface revienne à la position portrait. Une fois que le contrôleur a été sauté, j'appuie simplement sur le contrôleur que j'avais l'intention de pousser en premier lieu. Visuellement, cela a fière allure - le contrôleur de vue vide et arbitraire n'est jamais vu par l'utilisateur.
la source
Il existe un moyen simple de forcer par programmation l'iPhone à l'orientation nécessaire - en utilisant deux des réponses déjà fournies par kdbdallas , Josh :
fonctionne comme un charme :)
ÉDITER:
pour iOS 6, je dois ajouter cette fonction: (fonctionne sur modal viewcontroller)
la source
J'ai creusé et creusé à la recherche d'une bonne solution à cela. J'ai trouvé ce billet de blog qui fait l'affaire: supprimez votre vue la plus externe de la clé
UIWindow
et ajoutez-la à nouveau, le système interrogera ensuite à nouveau lesshouldAutorotateToInterfaceOrientation:
méthodes de vos contrôleurs de vue, en imposant l'orientation correcte à appliquer. Voir: iPhone forçant uiview à se réorienterla source
La réponse de Josh fonctionne bien pour moi.
Cependant, je préfère publier une notification "L'orientation a changé, veuillez mettre à jour l'interface utilisateur" . Lorsque cette notification est reçue par un contrôleur de vue, il appelle
shouldAutorotateToInterfaceOrientation:
, vous permettant de définir n'importe quelle orientation en retournantYES
pour l'orientation souhaitée.Le seul problème est que cela force une réorientation sans animation. Vous devrez envelopper cette ligne entre
beginAnimations:
etcommitAnimations
pour obtenir une transition en douceur.J'espère que cela pourra aider.
la source
FWIW, voici mon implémentation de la définition manuelle de l'orientation (pour aller dans le contrôleur de vue racine de votre application, natch):
couplé à la
UINavigationControllerDelegate
méthode suivante (en supposant que vous utilisez aUINavigationController
):Cela prend en charge la rotation de la vue racine selon que l'entrée
UIViewController
prend en charge l'orientation actuelle de l'appareil. Enfin, vous voudrez vous connecterrotateInterfaceToOrientation
aux changements d'orientation réels de l'appareil afin d'imiter les fonctionnalités iOS standard. Ajoutez ce gestionnaire d'événements au même contrôleur de vue racine:Enfin, inscrivez-vous aux
UIDeviceOrientationDidChangeNotification
notifications dansinit
ouloadview
comme suit:la source
shouldAutorotate
méthode (voir stackoverflow.com/a/12586002/5171 ).Cela fonctionne pour moi (merci Henry Cooke):
Le but pour moi était de traiter uniquement des changements d'orientation du paysage.
méthode init:
la source
Je me rends compte que le message original ci-dessus dans ce fil est très ancien maintenant, mais j'ai eu un problème similaire - à savoir. tous les écrans de mon application sont uniquement en mode portrait, à l'exception d'un écran, qui peut être pivoté entre paysage et portrait par l'utilisateur.
C'était assez simple, mais comme d'autres articles, je voulais que l'application revienne automatiquement en portrait quelle que soit l'orientation actuelle de l'appareil, lors du retour à l'écran précédent.
La solution que j'ai mise en œuvre était de masquer la barre de navigation en mode paysage, ce qui signifie que l'utilisateur ne peut revenir aux écrans précédents qu'en mode portrait. Par conséquent, tous les autres écrans ne peuvent être qu'en mode portrait.
Cela présente également l'avantage supplémentaire pour mon application en ce sens qu'il y a plus d'espace d'écran disponible en mode paysage. Ceci est utile car l'écran en question est utilisé pour afficher des fichiers PDF.
J'espère que cela t'aides.
la source
J'ai résolu cela assez facilement à la fin. J'ai essayé toutes les suggestions ci-dessus et j'ai toujours échoué, alors c'était ma solution:
Dans le ViewController qui doit rester Paysage (Gauche ou Droite), j'écoute les changements d'orientation:
Puis dans didRotate:
Gardez à l'esprit toutes les super vues / sous-vues qui utilisent le redimensionnement automatique, car les vues.bonds / cadre sont réinitialisés explicitement ...
La seule mise en garde à cette méthode pour conserver la vue Paysage, est l'animation inhérente à la commutation entre les orientations qui doit se produire, alors qu'il serait préférable qu'elle semble n'avoir aucun changement.
la source
Solution iOS 6:
Le code exact dépend de l'application et de l'endroit où vous le placez (je l'ai utilisé dans mon AppDelegate). Remplacez
[[self window] rootViewController]
par ce que vous utilisez. J'utilisais un fichierUITabBarController
.la source
J'ai trouvé une solution et j'ai écrit quelque chose en français (mais le code est en anglais). ici
Le moyen est d'ajouter le contrôleur à la vue de la fenêtre (le contrôleur doit posséder une bonne implémentation de la fonction shouldRotate ....).
la source
Si vous utilisez UIViewControllers, il existe cette méthode:
Retournez
NO
pour les contrôleurs de vue contenant les vues que vous ne souhaitez pas faire pivoter.Plus d'infos ici
la source
Je ne pense pas que cela soit possible au moment de l'exécution, bien que vous puissiez bien sûr simplement appliquer une transformation à 90 degrés à votre interface utilisateur.
la source
C'est ce que j'utilise. (Vous obtenez des avertissements de compilation mais cela fonctionne à la fois dans le simulateur et l'iPhone)
la source