2008-08-02 10 views
88

Note: 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 fonctionnant en mode paysage dès le départ, quelle que soit la position de l'appareil?Application iPhone en mode paysage, systèmes 2008

À la fois par programmation et en utilisant Interface Builder.

+5

Pour les futurs lecteurs, s'il vous plaît 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. – Fattie

Répondre

46

Réponse historique seulement. Spectaculeusement dépassé:

Veuillez noter que cette réponse est maintenant extrêmement périmée.

Cet article est seulement une curiosité historique.


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

Il semblerait qu'il n'est plus nécessaire de forcer la taille de la vue sur chaque vue, et le problème sérieux spécifique de paysage "ne fonctionnant que la première fois" 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, donc la question est purement une curiosité historique. C'est incroyable combien de problèmes cela a causé aux développeurs depuis si longtemps!


Voici la discussion d'origine et la solution. Ceci est totalement hors de propos maintenant, car ces systèmes ne sont même pas opérationnels.


Il est extrêmement difficile de faire ce travail tout à fait - il y a au moins trois problèmes/bugs en jeu.

essayer .. interface builder landscape design

note en particulier que, lorsqu'il dit « et vous devez utiliser shouldAutorotateToInterfaceOrientation correctement partout » cela signifie partout, toutes vos vues en plein écran.

Espérons que cela aide dans ce cauchemar!

Un rappel important du problème bien connu ADDITIONNEL à portée de main ici: si vous essayez d'échanger entre PLUS D'UN vue (tous les paysages), IL NE FONCTIONNE PAS SIMPLEMENT. Il est essentiel de s'en souvenir ou vous perdrez des jours sur le problème. C'est littéralement pas possible. C'est le plus gros bug ouvert et connu de la plateforme iOS. Il n'y a littéralement aucun moyen de faire en sorte que le matériel fasse la deuxième vue que vous chargez, soyez paysage. La solution de contournement ennuyeuse mais simple, et ce que vous devez faire, est d'avoir un maître UIViewController trivial qui ne fait rien mais reste assis et vous permettez de basculer entre vos vues.

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

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

Vous pouvez le faire qu'une seule fois. Plus tard, si vous essayez de supprimer happyThing.view, et mettez à la place newThing.view, IL NE FONCTIONNE PAS - ET C'EST CELA.La machine ne fera jamais pivoter la vue vers le 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 se trouve simplement là et ne contient que vos différentes vues (happyThing, newThing, etc). J'espère que cela aide!

+2

Je crois que cela a été corrigé dans 4.x. Nous avons expédié un jeu qui avait un tas d'écrans différents, du paysage et du portrait, et ça ne fonctionnait pas dans 3.x. Ne voulant pas entrer dans la vue du mannequin supplémentaire pour le gérer, nous avons plutôt demandé 4.x - qui, un an après que cette question a été posée, est probablement OK. – AndrewS

+0

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. App lance le paysage, reste ainsi à travers plusieurs transitions d'écran. Nous n'utilisons pas de vue fictive, mais nous DEVONS outrepasser shouldAutorotate dans chaque écran. Pas de problèmes sur 4.x, du toucher au pad au téléphone. – AndrewS

40

à partir du site d'Apple Dev:

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

2: Lancement de l'application en mode paysage

<key>UIInterfaceOrientation</key> 
<string>UIInterfaceOrientationLandscapeRight</string> 
+5

Ce plus dans vos méthodes shouldAutorotateToInterfaceOrientation return (interfaceOrientation! = UIInterfaceOrientationPortrait); et tu as fini. – mbehan

+5

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

+1

Curieusement, la "réponse" ne sera en fait pas démarrer l'appareil en mode paysage - !! C'est probablement le bug/la difficulté le plus célèbre dans tout l'environnement Apple. C'est une base pour le développeur iPad très travaillant! – Fattie

6

années DGSDE et la réponse de michaelpryor semble être correct, 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 le window makeKeyAndVisible; en premier.

Quelques liens: Developing in landscape mode, iPhone SDK: How to force Landscape mode only?

@ Robert: s'il vous plaît se référer à The iPhone SDK, NDA, and Stack Overflow.

4

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

  • définissez les propriétés Info.plist (cela change la position de la barre d'état, mais pas la vue)
  • faire pivoter la vue manuellement autour de son centre, soit sur votre UIViewController viewDidLoad: méthode ou votre méthode applicationDidFinishLaunching: ou mettre en œuvre la rotation automatique (les "comportements" Autoresizing page 124)

Rechercher "Lancement en mode paysage", à la page 102.

7

d'abord, je mis dans les informations.plist

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

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

27

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

Au 3.2 vous ne pouvez pas changer l'orientation d'une application en cours d'exécution du code.

Mais vous pouvez commencer une application avec une orientation fixe, même si cela n'est pas évidente.

Essayez avec cette recette:

  1. définir votre orientation UISupportedInterfaceOrientations dans le fichier Info.plist
  2. dans votre fenêtre définir un 480x320 "contrôleur de vue de base". Chaque autre vue sera ajoutée en tant que sous-vue à sa vue.
  3. dans tous les contrôleurs de vue mis en place la méthode shouldAutorotateToInterfaceOrientation: (pour revenir la même valeur que celle 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)

    en la méthode viewDidLoad.

Mise à jour (iOS 4.x, 5.x): l'Apple App iOS Guide de programmation a un "lancement en mode paysage" paragraphe dans le chapitre "Advanced App Tricks".

Références:

+1

Je peux confirmer que c'est la seule solution vraiment efficace (avec une petite addition). Il m'a fallu des heures pour trouver et évaluer cela. Toutes les autres réponses ne sont que des solutions partielles au problème. –

+0

J'adore comment le lien vers la question SO renvoie à cette question. –

+0

Ty Richard, lien en boucle supprimé – IlDan

5

Je ne suis pas surpris un est venu avec cette réponse encore:

Dans tous mes tests en destituant un modal Contrôleur de vue L'orientation préférée du contrôleur de vue parent définie en shouldAutorotateToInterfaceOrientation est honorée même si elle fait partie d'un UINavi gationController. Donc, la solution est simple:

Créer une UIViewController factice avec un UIImageView pour un fond. Définissez l'image sur l'image default.png utilisée par votre application au démarrage.

Lorsque viewWillAppear est appelé dans votre contrôleur de vue racine, il suffit de présenter le contrôleur de vue factice sans animation.

quand viewDidAppear est appelé dans votre contrôleur de vue factice, le contrôleur de rejeter avec une belle vue Fondu animation.

Non seulement cela fonctionne, mais il semble bon!BTW pour clarifier les choses que je fais viewWillAppear de contrôleur de vue racine comme ceci:

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

Voir cette réponse: Landscape Mode ONLY for iPhone or iPad

  1. ajouter l'orientation à plist
  2. shouldAutorotateToInterfaceOrientation = OUI dans tous les fichiers

Bien que si vous utilisez des modes mixtes, vous pouvez être mieux avec

[[UIDevice currentDevice] setOrientation:UIInterfaceOrientationLandscapeRight]; 
Questions connexes