99 votes

Application iPhone en mode paysage, systèmes 2008

Veuillez noter que cette question date de 2008 et n'a plus qu'un intérêt historique.


Quelle est la meilleure façon de créer une application iPhone qui fonctionne en mode paysage dès le départ, quelle que soit la position de l'appareil ?

Aussi bien par programme qu'à l'aide de l'Interface Builder.

6 votes

Pour tous les futurs lecteurs, veuillez noter que ce fameux problème est maintenant résolu par Apple à partir de 2011. Notez le projet de test dans la réponse ci-dessous.

47voto

Joe Blow Points 3618

Réponse historique uniquement. Spectaculairement dépassée.

Veuillez noter que cette réponse est maintenant largement dépassée/.

Cette réponse est seulement une curiosité historique .


Nouvelles excitantes ! Comme découvert par Andrew ci-dessous, ce problème a été corrigé par Apple dans la version 4.0+.

Il semblerait qu'il ne soit plus nécessaire de forcer la taille de la vue sur chaque vue, et le problème spécifique et sérieux du paysage "ne fonctionnant que la première fois" a été résolu.

Depuis avril 2011, il n'est plus possible de tester ou même de construire quoi que ce soit en dessous de la version 4.0, donc la question est purement une curiosité historique. C'est incroyable le nombre de problèmes que cela a causé aux développeurs pendant si longtemps !


Voici la discussion et la solution originales. Cela n'a plus rien à voir maintenant, car ces systèmes ne sont même pas opérationnels.


Il est EXTRÊMEMENT DIFFICILE de faire fonctionner ce système complètement - il y a au moins trois problèmes/bugs en jeu.

Essayez ceci. constructeur d'interface conception de paysage

Notez en particulier que là où il est dit "et vous devez utiliser shouldAutorotateToInterfaceOrientation correctement partout" ça veut dire partout, toutes vos vues en plein écran.

J'espère que cela vous aidera dans ce cauchemar !

Un rappel important du problème supplémentaire bien connu qui se pose ici : si vous essayez de passer d'un service à l'autre, vous devez vous assurer qu'il n'y a pas de problème. PLUS D'UN vue (tous les paysages), CELA NE FONCTIONNE TOUT SIMPLEMENT PAS . Il est essentiel de s'en souvenir, sinon vous perdrez des jours à résoudre ce problème. Ce n'est littéralement PAS POSSIBLE. C'est le plus grand bogue ouvert, connu, de la plateforme iOS. Il n'y a littéralement aucun moyen d'obliger le matériel à faire en sorte que la deuxième vue que vous chargez soit un paysage. La solution de contournement ennuyeuse mais simple, et ce que vous devez faire, est d'avoir un UIViewController maître trivial qui ne fait rien d'autre que de rester là et de vous laisser passer d'une vue à l'autre.

En d'autres termes, dans iOS à cause d'un bug majeur connu :

[window addSubview:happyThing.view];
[window makeKeyAndVisible];

Vous ne pouvez le faire qu'une fois . Plus tard, si vous essayez de supprimer happyThing.view, et de mettre à la place newThing.view, cela ne fonctionne pas - et c'est tout. La machine ne fera jamais pivoter la vue en paysage. Il n'y a pas de solution miracle, même Apple ne peut pas le faire fonctionner. La solution de contournement que vous devez adopter est d'avoir un UIViewController global qui reste simplement là et qui contient vos différentes vues (happyThing, newThing, etc.). J'espère que cela vous aidera !

2 votes

Je crois que ce problème a été corrigé dans la version 4.x. Nous avons livré un jeu qui comportait plusieurs écrans différents, certains en mode paysage et d'autres en mode portrait, et cela ne fonctionnait tout simplement pas dans la version 3.x. Comme nous ne voulions pas nous lancer dans l'élaboration d'une vue factice supplémentaire pour le gérer, nous avons préféré demander la version 4.x - ce qui, un an après que cette question ait été posée, est probablement correct.

0 votes

Nous n'avons pas fait "toujours paysage" mais plutôt diversement paysage ou portrait. Chaque VC est directement ajouté et retiré de la fenêtre. L'application se lance en mode paysage et reste dans cette position à travers plusieurs transitions d'écran. Nous n'utilisons pas de vue factice, mais nous surchargeons shouldAutorotate dans chaque écran. Aucun problème sur 4.x, du tactile au téléphone en passant par le pad.

40voto

Michael Pryor Points 11198

Du site Apple Dev :

Pour démarrer votre application en mode paysage afin que la barre d'état soit immédiatement position appropriée immédiatement, modifiez votre fichier Info.plist pour ajouter la clé UIInterfaceOrientation avec la valeur appropriée (UIInterfaceOrientationLandscapeRight ou UIInterfaceOrientationLandscapeLeft), comme indiqué dans le Listing 2.

Listing 2 : Démarrage de votre application en mode paysage

<key>UIInterfaceOrientation</key>
<string>UIInterfaceOrientationLandscapeRight</string>

5 votes

Ce plus dans vos méthodes shouldAutorotateToInterfaceOrientation return (interfaceOrientation != UIInterfaceOrientationPortrait) ; et vous avez terminé.

5 votes

La question demande comment démarrer l'appareil en mode paysage. La réponse donne cette information. La gestion de l'orientation après cela n'est pas mentionnée dans la question. +1 Michael Pryor

1 votes

Fait intriguant, la "réponse" ne fera en fait PAS démarrer l'appareil en mode paysage ! C'est probablement le bug/difficulté le plus célèbre de tout l'environnement Apple. C'est une base pour tout développeur d'iPad qui travaille !

28voto

IlDan Points 4104

Résumé et intégration de tous les messages, après l'avoir testé moi-même ; vérifiez la mise à jour pour 4.x, 5.x ci-dessous.

Depuis la version 3.2, vous ne pouvez plus modifier l'orientation d'une application en cours d'exécution à partir du code.

Mais vous pouvez démarrer une application avec une orientation fixe, bien que cela ne soit pas simple.

Essayez avec cette recette :

  1. réglez votre orientation sur UISupportedInterfaceOrientations dans le Info.plist fichier
  2. dans votre fenêtre, définissez un "contrôleur de vue de base" de 480x320. Chaque autre vue sera ajoutée en tant que sous-vue à sa vue.
  3. dans tous les contrôleurs de vue, mettre en place le shouldAutorotateToInterfaceOrientation: (pour retourner la même valeur que celle que vous avez définie dans la plist, bien sûr)
  4. dans tous les contrôleurs de vue, définir une vue d'arrière-plan avec

    self.view.frame = CGRectMake(0, 0, 480, 320)

    dans le viewDidLoad método.

Mise à jour (iOS 4.x, 5.x) Le Guide de programmation des applications iOS d'Apple contient un paragraphe intitulé "Lancement en mode paysage" dans le chapitre "Astuces pour les applications avancées".

Références :

1 votes

Je peux confirmer que c'est la seule solution qui fonctionne vraiment (avec un petit ajout). Il m'a fallu des heures pour trouver et évaluer cette solution. Toutes les autres réponses ne sont que des solutions partielles au problème.

8voto

samvermette Points 20225

D'abord j'ai mis dans info.plist

<key>UIInterfaceOrientation</key>
<string>UIInterfaceOrientationLandscapeRight</string>

puis j'ai mis ce code dans applicationDidFinishLaunching :

CGAffineTransform rotate = CGAffineTransformMakeRotation(1.57079633);
[window setTransform:rotate];

CGRect contentRect = CGRectMake(0, 0, 480, 320); 
window.bounds = contentRect; 
[window setCenter:CGPointMake(160.0f, 240.0f)]; 

De cette façon, je peux travailler sur la vue dans Interface Builder en mode paysage.

7voto

Sören Kuklau Points 9445

La réponse de sasb et de michaelpryor semble correcte, mais si elle ne fonctionne pas pour vous, essayez cette alternative :

- (void)applicationDidFinishLaunchingUIApplication *)application {
    application.statusBarOrientation = UIInterfaceOrientationLandscapeRight;
}

Ou celui-là :

[[UIDevice currentDevice] setOrientation:UIInterfaceOrientationLandscapeRight];

Ou celui-là :

[application setStatusBarOrientation: UIInterfaceOrientationLandscapeRight animated:NO];

Vous devrez peut-être aussi appeler window makeKeyAndVisible; d'abord.

Quelques liens : Développement en mode paysage , iPhone SDK : Comment forcer le mode Paysage uniquement ?

@Robert : veuillez vous référer à Le SDK de l'iPhone, le NDA et Stack Overflow .

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