Application iPhone en mode paysage, systèmes 2008

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?

Les deux par programme et en utilisant l'Interface Builder.

0
ajouté édité
Vues: 2
Avez-vous essayé de changer la symbologie utilisée par les polygones? Pour le contour du polygone, choisissez un symbole de ligne cartographique, - définissez le décalage du symbole de ligne de contour sur un nombre négatif (dans l'onglet Propriétés de la ligne).
ajouté l'auteur saint_groceon, source
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.
ajouté l'auteur Fattie, source
Oui. Le problème avec cela est que vous ne pouvez pas aller plus loin que quelques pts avec la ligne de démarcation avant que toutes sortes de sur/sous-dépassements et pointes bizarres se produisent. Exemple de photo , tiré de Spikes sur les lignes épaisses offset thread.
ajouté l'auteur Greg, source
@matt A des fins visuelles, après avoir symbolisé, affichez les données via un représentation cartographique .
ajouté l'auteur DavidWhitney, source

8 Réponses

Utilisez l'outil Buffer de la boîte à outils Analyse et entrez une valeur négative pour la distance du tampon. Choisissez OUTSIDE_ONLY pour le type de côté, puis dissolvez sur les attributs pertinents.

Nécessite une licence avancée .

Une fois que les tampons attribués existent, pouvons-nous utiliser Requêtes de définition pour n'afficher que certaines FN et/ou afficher chacune d'entre elles avec un symbole séparé provenant d'une même classe d'entités.

buffer tool with relevant fields highlighted Using separate symbol for each feature class

7
ajouté

Depuis le site de développement Apple:

To start your application in landscape mode so that the status bar is in the appropriate position immediately, edit your Info.plist file to add the UIInterfaceOrientation key with the appropriate value (UIInterfaceOrientationLandscapeRight or UIInterfaceOrientationLandscapeLeft), as shown in Listing 2.

Listing 2: Starting your application in landscape mode

UIInterfaceOrientation
UIInterfaceOrientationLandscapeRight
0
ajouté
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
ajouté l'auteur ingh.am, source
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!
ajouté l'auteur Fattie, source
@mbehan Il y a aussi UIInterfaceOrientationPortraitUpsideDown, donc pas un correctif. En outre, UIInterfaceOrientation dans .plist est pris en charge uniquement sur les versions 3.2+, pas sur les périphériques 3.1.3 et plus anciens (et rappelez-vous que l'iPhone 2G est bloqué sur cette version).
ajouté l'auteur Ivan Vučica, source
Ce plus dans vos méthodes shouldAutorotateToInterfaceOrientation renvoie (interfaceOrientation! = UIInterfaceOrientationPortrait); et tu as fini.
ajouté l'auteur mbehan, source

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

S'il vous plaît noter que cette réponse est maintenant extrêmement périmé.

Cet article n'est qu'une curiosité historique .


Nouvelles excitantes! 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 du paysage "ne fonctionnant que la première fois" a été résolu.

En 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 et la solution originales. Ceci est totalement hors de propos maintenant, car ces systèmes ne sont même pas opérationnels.


Il est EXTREMEMENT DIFFICILE de faire ce travail pleinement - il y a au moins trois problèmes / bugs en jeu.

try this .. interface builder landscape design

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 ça aide dans ce cauchemar!

Un rappel important du problème ADDITIONNEL bien connu ici: si vous essayez d'échanger entre UNE vue (tout paysage), 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 important:

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

You can do that only once. Later, if you try to remove happyThing.view, and instead put in there newThing.view, IT DOES NOT WORK - AND THAT'S THAT. The machine will never rotate the view to landscape. There is no trick fix, even Apple cannot make it work. The workaround you must adopt is having an overall UIViewController that simply sits there and just holds your various views (happyThing, newThing, etc). Hope it helps!

0
ajouté
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.
ajouté l'auteur AndrewS, source
Nous n'avons pas fait "toujours du 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.
ajouté l'auteur AndrewS, source

D'abord, je définis dans info.plist

UIInterfaceOrientation
UIInterfaceOrientationLandscapeRight

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

0
ajouté

Résumé et intégration de tous les posts, après les avoir testés 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. set your orientation to UISupportedInterfaceOrientations in the Info.plist file
  2. in your window define a 480x320 "base view controller". Every other view will be added as a subview to its view.
  3. in all view controllers set up the shouldAutorotateToInterfaceOrientation: method (to return the same value you defined in the plist, of course)
  4. in all view controllers set a background view with

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

    in the viewDidLoad method.

Update (iOS 4.x, 5.x): the Apple iOS App Programming Guide has a "Launching in Landscape Mode" paragraph in the "Advanced App Tricks" chapter.

Les références:

0
ajouté
J'adore comment le lien vers la question SO renvoie à cette question.
ajouté l'auteur Richard J. Ross III, source
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.
ajouté l'auteur Johannes Rudolph, source
Ty Richard, lien en boucle supprimé
ajouté l'auteur IlDan, source

La réponse de sasb et michaelpryor semble 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 d'abord appeler la fenêtre makeKeyAndVisible; .

A few links: Developing in landscape mode, iPhone SDK: How to force Landscape mode only?

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

0
ajouté

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

Dans tous mes tests, lorsque vous rejetez un contrôleur de vue modale, l'orientation préférée du contrôleur de vue parent définie dans shouldAutorotateToInterfaceOrientation est honorée même si elle fait partie d'un UINavigationController. Donc la solution à cela est simple:

Créez un UIViewController factice avec un UIImageView pour un arrière-plan. 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, présentez simplement le contrôleur de vue fictive sans animation.

lorsque viewDidAppear est appelé dans votre contrôleur de vue fictive, fermez le contrôleur de vue avec une animation symétrique.

Non seulement cela fonctionne, mais ça a l'air bien! BTW, juste pour clarifier je fais le viewWillAppear du 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;
 }
...
}
0
ajouté

See this answer: Landscape Mode ONLY for iPhone or iPad

  1. ajouter une orientation à plist
  2. shouldAutorotateToInterfaceOrientation = YES dans tous les fichiers

Bien que si vous utilisez des modes mixtes, vous serez peut-être mieux avec

[[UIDevice currentDevice] setOrientation:UIInterfaceOrientationLandscapeRight];
0
ajouté