Question

Note:cette question date de 2008 et n’a désormais qu’un intérêt historique.


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

À la fois par programme et en utilisant Interface Builder.

Était-ce utile?

La solution

Réponse historique uniquement.Spectaculairement obsolète :

Veuillez noter que cette réponse est désormais extrêmement obsolète.

Ce message est seulement une curiosité historique.


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

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

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


Voici la discussion originale et la solution.Cela n’a absolument plus d’importance aujourd’hui, puisque ces systèmes ne sont même pas opérationnels.


Il est EXTRÊMEMENT DIFFICILE de faire en sorte que cela fonctionne pleinement – ​​il y a au moins trois problèmes/bugs en jeu.

essaye ça .. conception de paysage de constructeur d'interface

Notez en particulier que là où il est écrit "et vous devez utiliser ShouldAutorotateToInterfaceOrientation correctement partout" cela signifie partout, toutes vos vues en plein écran.

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

Un rappel important du problème ADDITIONNEL bien connu ici :si vous essayez de permuter entre PLUS D'UN vue (tout paysage), CELA NE FONCTIONNE PAS TOUT SIMPLEMENT.Il est essentiel de s’en souvenir, sinon vous perdrez des journées sur ce problème.Ce n’est littéralement PAS POSSIBLE.Il s’agit du plus gros bug ouvert connu sur la plate-forme iOS.Il n'y a littéralement aucun moyen de faire en sorte que le matériel fasse en sorte que la deuxième vue que vous chargez soit en mode paysage.La solution de contournement ennuyeuse mais simple, et ce que vous devez faire, est d'avoir un maître trivial UIViewController qui ne fait que rester là et vous permettre de basculer entre vos vues.

En d’autres termes, sous iOS à cause d’un bug majeur connu :

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

Tu ne peux le faire qu'une seule fois.Plus tard, si vous essayez de supprimer happyThing.view et d'y mettre newThing.view à la place, CELA NE FONCTIONNE PAS - ET C'EST TOUT.La machine ne fera jamais pivoter la vue en mode 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 consiste à disposer d'un UIViewController global qui reste simplement là et contient simplement vos différentes vues (happyThing, newThing, etc.).J'espère que cela aide!

Autres conseils

Depuis le site de développement Apple :

Pour démarrer votre application en mode paysage afin que la barre d'état soit immédiatement dans la position appropriée, modifiez votre fichier info.plist pour ajouter la touche uiInterfaceOrientation avec la valeur appropriée (uiInterfaceOrientationLandscaperIght ou uiInterfaceOrientationlandScapeleft), comme indiqué dans Listing 2.

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

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

Résumé et intégration de tous les posts, 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 pas 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, même si cela n’est pas simple.

Essayez avec cette recette :

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

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

    dans le viewDidLoad méthode.

Mise à jour (iOS 4.x, 5.x):le guide de programmation de l'application Apple iOS contient un paragraphe « Lancement en mode paysage » dans le chapitre « Astuces avancées pour l'application ».

Les références:

J'ai d'abord défini info.plist

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

puis je mets 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.

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

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

Ou celui-ci :

[[UIDevice currentDevice] setOrientation:UIInterfaceOrientationLandscapeRight];

Ou celui-ci :

[application setStatusBarOrientation: UIInterfaceOrientationLandscapeRight animated:NO];

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

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

@Robert :prière de se référer à Le SDK iPhone, NDA et Stack Overflow.

Je suis surpris que personne n'ait encore trouvé cette réponse :

Dans tous mes tests lors du rejet d'un contrôleur de vue modal, l'orientation préférée du contrôleur de vue parent est définie dans shouldAutorotateToInterfaceOrientation est honoré même lorsqu'il fait partie d'un UINavigationController.La solution à ce problème est donc simple :

Créez un UIViewController factice avec un UIImageView pour un arrière-plan.Définissez l’image sur l’image default.png que votre application utilise au démarrage.

Quand viewWillAppear est appelé dans votre contrôleur de vue racine, présentez simplement le contrôleur de vue factice sans animation.

quand viewDidAppear est appelé dans votre contrôleur de vue factice, rejetez le contrôleur de vue avec une belle animation de dissolution croisée.

Non seulement ça marche, mais ça a l'air bien !BTW, juste pour clarifier, je fais le contrôleur de vue racine viewWillAppear comme ça:

- (void)viewWillAppear:(BOOL)animated
{
 if ( dummy != nil ) {
  [dummy setModalTransitionStyle:UIModalTransitionStyleCrossDissolve];
  [self presentModalViewController:dummy animated:NO];
  [dummy release];
  dummy = nil;
 }
...
}

Le dernier guide de programmation iPhone OS contient une section complète à ce sujet, avec un exemple de code.Je suis sûr qu'il s'agit d'un ajout récent, alors peut-être que vous l'avez manqué.Il explique toutes les conditions que vous devez respecter ;essentiellement...

  • définir les propriétés Info.plist (cela change la position de la barre d'état, mais pas la vue)
  • faites pivoter votre vue manuellement autour de son centre, soit sur votre viewDidLoad UIViewController :méthode ou votre applicationDidFinishLaunching :ou implémenter la rotation automatique ("Comportements de redimensionnement automatique", page 124)

Recherchez « Lancement en mode paysage », page 102.

Voir cette réponse : Mode paysage UNIQUEMENT pour iPhone ou iPad

  1. ajouter une orientation au plist
  2. ShouldAutorotateToInterfaceOrientation = OUI dans tous les fichiers

Bien que si vous utilisez des modes mixtes, vous feriez peut-être mieux d'utiliser

[[UIDevice currentDevice] setOrientation:UIInterfaceOrientationLandscapeRight];
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top