Application iPhone en mode paysage, systèmes 2008

98

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


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

À la fois par programme et en utilisant le générateur d'interface.

Michiel de Mare
la source
5
Pour tout futur lecteur, 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.
Fattie

Réponses:

47

Réponse historique seulement. Spectaculairement démodé.

Veuillez noter que cette réponse est maintenant très obsolète /

Cette réponse n'est qu'une curiosité historique .


Nouvelles excitantes! Comme découvert par 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 sur chaque vue, et le grave problème spécifique du 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 à quel point cela a causé des problèmes aux développeurs pendant si longtemps!


Voici la discussion originale 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 en sorte que cela fonctionne pleinement - il y a au moins trois problèmes / bogues en jeu.

essayez ceci .. conception de paysage de constructeur d'interface

Notez en particulier que là où il est dit «et que vous devez utiliser shouldAutorotateToInterfaceOrientation correctement partout», cela signifie partout, toutes vos vues en plein écran.

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

Un rappel important du problème ADDITIONNEL bien connu à portée de main ici: si vous essayez de basculer entre PLUS D'UNE vue (tout paysage), CELA NE FONCTIONNE PAS SIMPLEMENT . Il est essentiel de s'en souvenir ou vous perdrez des jours sur le problème. Ce n'est littéralement PAS POSSIBLE. C'est le plus gros bogue ouvert et connu sur la plate-forme iOS. Il n'y a littéralement aucun moyen de faire en sorte que le matériel transforme la deuxième vue que vous chargez en 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 d'autre que rester là et vous permet de basculer entre vos vues.

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

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

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

Fattie
la source
2
Je crois que cela a été corrigé dans 4.x. Nous avons livré un jeu avec un tas d'écrans différents, des paysages et des portraits, et cela ne fonctionnait tout simplement pas dans 3.x. Ne voulant pas entrer dans la vue factice supplémentaire pour le gérer, nous avons plutôt besoin de 4.x - ce qui, un an après que cette question a été posée, est probablement OK.
AndrewS
Nous n'avons pas fait "toujours paysage" mais plutôt diversement paysage ou portrait. Chaque VC est directement ajouté et supprimé de la fenêtre. L'application lance le paysage, reste ainsi à travers plusieurs transitions d'écran. Nous n'utilisons pas de vue factice, mais nous remplaçons shouldAutorotate dans chaque écran. Aucun problème sur 4.x, du toucher au clavier au téléphone.
AndrewS
41

Depuis le site des développeurs 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 clé UIInterfaceOrientation avec la valeur appropriée (UIInterfaceOrientationLandscapeRight ou UIInterfaceOrientationLandscapeLeft), comme indiqué dans le listing 2.

Listing 2: Démarrer votre application en mode paysage

<key>UIInterfaceOrientation</key>
<string>UIInterfaceOrientationLandscapeRight</string>
Michael Pryor
la source
5
Ce plus dans vos méthodes shouldAutorotateToInterfaceOrientation return (interfaceOrientation! = UIInterfaceOrientationPortrait); et tu as fini.
Michael Behan
5
La question demande comment démarrer l'appareil en mode paysage. Les réponses donnent cette information. La gestion de l'orientation après cela n'est pas mentionnée dans la question. +1 Michael Pryor
ingh.am
1
Curieusement, la "réponse" ne démarrera en fait PAS l'appareil en mode paysage - !! C'est probablement le bogue / difficulté le plus connu de tout l'environnement Apple. C'est une base pour les développeurs iPad très actifs!
Fattie
@mbehan Il y a aussi UIInterfaceOrientationPortraitUpsideDown, donc pas de correctif. De plus, UIInterfaceOrientation dans .plist n'est pris en charge que sur 3.2+, pas sur les appareils 3.1.3 et plus anciens (et rappelez-vous que l'iPhone 2G est bloqué sur cette version).
Ivan Vučica
28

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

À partir de 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, bien que cela ne soit pas simple.

Essayez avec cette recette:

  1. définir votre orientation UISupportedInterfaceOrientationsdans le Info.plistfichier
  2. dans votre fenêtre définissez un "contrôleur de vue de base" 480x320. Chaque autre vue sera ajoutée en tant que sous-vue à sa vue.
  3. dans tous les contrôleurs de vue, configurez la 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éfinissent une vue d'arrière-plan avec

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

    dans la viewDidLoadmé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 de l'application».

Références:

IlDan
la source
1
Je peux confirmer que c'est la seule solution vraiment efficace (avec un petit ajout). 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.
Johannes Rudolph
8

J'ai d'abord mis dans 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.

samvermette
la source
7

La réponse de sasb et de 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 en window makeKeyAndVisible;premier.

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

@Robert: veuillez vous reporter à l'iPhone SDK, NDA et Stack Overflow .

Sören Kuklau
la source
6

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 modale, l'orientation préférée du contrôleur de vue parent définie shouldAutorotateToInterfaceOrientationest respectée même lorsqu'elle fait partie d'un UINavigationController. La solution à cela 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.

Lorsqu'il viewWillAppearest appelé dans votre contrôleur de vue racine, présentez simplement le contrôleur de vue factice sans animation.

lorsqu'il viewDidAppearest appelé dans votre contrôleur de vue factice, fermez le contrôleur de vue avec une belle animation de dissoudre croisée.

Non seulement cela fonctionne, mais ça a l'air bien! BTW, juste pour clarifier, je fais le contrôleur de vue racine viewWillAppearcomme ceci:

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

Le dernier guide de programmation iPhone OS contient une section complète à 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; fondamentalement...

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

Recherchez «Lancement en mode paysage», page 102.


la source
4

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

  1. ajouter une orientation à 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];
nicc
la source