2010-04-22 9 views
8

Je suis strugging à obtenir une application iPhone qui nécessite à peu près chaque pression ou de la pop dans le Nav Controller Stack pour changer d'orientation. Fondamentalement, la première vue est portrait, le deuxième paysage le troisième portrait à nouveau (Oui, je sais que ce n'est pas idéal, mais c'est le design et je dois l'implémenter).Obliger changements UIInterfaceOrientation sur iPhone

Je suis passé par divers conseils ici ....
How do I detect a rotation on the iPhone without the device autorotating?
Force portrait orientation on pushing new view to UINavigationViewController
Is there a documented way to set the iPhone orientation?
Mais sans succès total.

Réglage de lier contre 3.1.2 ma lecture des articles liés ci-dessus semble indiquer que si mon mode portrait pousse une vue avec

 
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { 
    // Return YES for supported orientations 
    return ((interfaceOrientation == UIInterfaceOrientationLandscapeRight)); 
} 
Ensuite, alors ce point de vue doit apparaître orienté en mode paysage. Ce qui se passe est qu'il apparaît dans sa forme portrait "cassé", puis tourne correctement lorsque l'appareil est tourné.

Si j'applique le contrôleur à ma vue de portrait (qui a un shouldAutoRotate approprié ...) alors cela reste dans la vue de paysage cassée jusqu'à ce que l'appareil soit retourné à l'orientation portrait.

J'ai également essayé d'enlever tous les messages de shouldautorotate, et forcer plutôt la rotation en transformant la vue. Ce genre d'œuvres, et je l'ai compris que en déplaçant la barre d'état (qui est en fait caché dans mon application) [UIApplication sharedApplication].statusBarOrientation = UIInterfaceOrientationLandscapeRight; le clavier apparaît avec l'orientation correcte quand on le souhaite. Le problème avec cette approche est que la transformation de la barre d'état est bizarre et laide quand vous n'avez pas de barre d'état - une ombre plane sur la page à chaque changement.

Donc. Qu'est-ce que je rate.

1) Ai-je tort de penser que dans 3.1.2 (ou peut-être plus tôt) shouldAutorotateToInterfaceOrientation devrait fournir l'orientation désirée simplement en poussant des contrôleurs?

2) Y a-t-il une autre façon d'afficher les claviers dans l'orientation correcte?

3) sont l'API non documentée appelle la voie à suivre (pas s'il vous plaît)

Répondre

4

Vous ne devriez pas utiliser [UIViewController shouldAutorotateToInterfaceOrientation:] pour déclencher un changement d'orientation!; il est seulement là pour informer le système si les rotations automatiques sont autorisées. Vous devriez toujours le mettre à jour pour spécifier l'orientation autorisée.

Si vous souhaitez modifier l'orientation lorsqu'une vue particulière est affichée, vous devez appeler [UIApplication setStatusBarOrientation:animated:] à l'intérieur de votre méthode de remplacement [UIViewController viewWillAppear:] pour chacun des contrôleurs de vue qui forcent une orientation particulière. Cela provoquera un changement quand une vue est poussée sur la pile et quand elle est désactivée. Assurez-vous d'appeler super dans votre méthode de remplacement.

Ceci est également le bon endroit pour changer la façon dont la barre d'état est affiché, si c'est quelque chose que vous faites.

+0

Je ne sais pas s'il y a une différence entre [UIApplication setStatusBarOreintation .... et [UIApplication sharedApplication] .statusBarOrientation ... Je vais tester, sinon c'est-ce que je l'ai fait, et je souffre de la ombre de la barre d'état tournant autour.Dans la vue de paysage, j'utilise une transformation pour montrer la vue dans le paysage initialement. Si j'autorise une vue paysage avec shouldAutorotateToInterfaceOrientation, ne sera-t-elle pas à nouveau tournée? Comment puis-je remplacer cela? – Andiih

+0

Notez que cette méthode est maintenant obsolète dans iOS 9. – fullofsquirrels