2009-10-07 10 views
4

Je comprends que cette question (ou ses variantes) a été posée à plusieurs reprises, mais il est toujours préférable d'aborder ce problème sans entrer dans les hacks kludgy.Affichage d'un paysage UIViewController dans un portrait UITabBarController/UINavigationController

J'ai une application avec la mise en page suivante:

UITabBarController 
    ↳ UINavigationController 
     ↳ PortraitViewController 
      ↳ LandscapeViewController 

Le premier PortraitViewController a son rightBarButtonItem ensemble à un UIBarButtonItem, qui appelle landscapeButtonPressed:. Cette méthode pousse le LandscapeViewController sur la pile du contrôleur de vue.

Dans LandscapeViewController, j'ai défini hidesBottomBarWhenPushed à YES lors de l'initialisation, car je souhaite uniquement que la barre de navigation soit visible.

Je demande aussi setStatusBarOrientation:UIInterfaceOrientationLandscapeRight sur [UIApplication sharedApplication] dans loadView et viewWillAppear:, puis le remettre pour UIInterfaceOrientationPortrait en viewWillDisappear:.

Dans mon implémentation shouldAutorotateToInterfaceOrientation:, je renvoie YES uniquement pour UIInterfaceOrientationLandscapeRight.

Le PortraitViewController ressemble à ceci:

Portrait View http://img.skitch.com/20091007-18ur7p3iubkrb1if5cak8wdxkb.png

Le LandscapeViewController ressemble à ceci:

Broken Landscape View http://img.skitch.com/20091007-f3ki1ga5m4ytkyg3wgwektp86e.png

Comme vous pouvez le voir, la vue ne tourne pas correctement. Si j'appelle la méthode privée -[UIDevice setOrientation:] avant d'appeler le -[UIApplication setStatusBarOrientation:], je peux faire tourner la barre de navigation correctement, mais je préfère ne pas appeler les méthodes privées et il ne semble pas y avoir de moyen d'obtenir les limites de ma vue principale pour établir des sous-vues. En utilisant les résultats de la méthode privée dans ce:

Better Landscape View http://img.skitch.com/20091007-8ckbx6gpbiateju9qjgew4x3k2.png

des idées sur la façon de résoudre ce problème?

Mon objectif est d'avoir une vue en orientation paysage, avec des coordonnées CGRect de paysage valides que je peux utiliser comme base pour la présentation des sous-vues.

Répondre

0

Le LandscapeViewController ne tourne pas automatiquement parce que interfaceOrientation est UIInterfaceOrientationLandscapeRight, donc vous devez revenir OUI pour UIInterfaceOrientationLandscapeRight

Pour avoir votre point de vue le redimensionnement correctement, vous devez ouvrir votre fichier xib avec Interface Builder, puis dans l'inspecteur et, enfin, dans l'onglet "Taille".

+0

Comme je l'ai dit dans la question, je suis déjà en train de retourner 'YES' dans le contrôleur de paysage. –

+0

J'étais sûr que vous aviez écrit 'UIInterfaceOrientationLandscapeLeft' au lieu de' UIInterfaceOrientationLandscapeRight' ... Mon erreur. – Marcio

1

Nathan,

je pense que vous avez défini PortraitViewController comme RootViewController de UINavigationController. Je crois également que vous restreignez l'orientation de PortraitViewController uniquement à UIInterfaceOrientationPortrait uniquement dans la méthode shouldAutorotateToInterfaceOrientation. Si tel est le cas, tout contrôleur de vue que vous appuyez sur aura l'orientation du rootViewController lui-même, sauf si vous ne modifiez pas l'orientation de l'appareil en faisant pivoter votre appareil.Par conséquent, si vous avez besoin de LandscapeViewController dans l'orientation UIInterfaceOrientationLandscapeRight, autorisez-le simplement dans la méthode shouldAutorotateToInterfaceOrientation: et ne le faites pas en définissant explicitement l'orientation de l'appareil.

Questions connexes