2010-01-27 5 views
10

J'ai une application basée sur la navigation dans laquelle j'aimerais que l'un des contrôleurs de vue prenne en charge l'orientation paysage. Pour ce viewcontroller (vc1), dans shouldAutorotate, je retourne YES pour toutes les orientations et dans les autres contrôleurs je retourne YES seulement pour le mode portraitiPhone - permet l'orientation paysage sur un seul contrôleur de vue

Mais même si l'appareil est en mode paysage et que je passe à la suivante écran de vc1, l'écran suivant est également tourné en mode paysage. J'ai supposé que si je retourne un OUI seulement pour le mode portrait, l'écran devrait apparaître seulement en portrait.

Est-ce le comportement attendu? Comment puis-je réaliser ce que je cherche?

Merci.

+0

double possible: http://stackoverflow.com/questions/181780/is-there-a-documented-way-to-set-the-iphone-orientation –

+0

Je ne veux pas mettre la orientation. Je veux juste que l'un des points de vue ne réponde pas aux changements d'orientation. – lostInTransit

+0

question similaire est également à http://stackoverflow.com/questions/2041884/problem-with-uiviewcontroller-orientation/2042040#2042040 mais aucune réponse ajoutée. –

Répondre

24

Vous ne pouvez pas prendre en charge l'orientation paysage uniquement pour l'un des contrôleurs de vue si vous utilisez la méthode shouldAutorotateToInterfaceOrientation de UIViewController.
Vous avez seulement deux choix si tous les viewcontrollers supportent le paysage ou si aucun viewcontrollers ne le supporte.

Si vous souhaitez prendre en charge le paysage uniquement pour un, vous devez détecter la rotation du périphérique et faire pivoter manuellement les vues dans le contrôleur de vue.
Vous pouvez détecter la rotation du périphérique en utilisant Notification.

[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications]; 
[[NSNotificationCenter defaultCenter] addObserver:self 
             selector:@selector(didRotate:) 
              name:UIDeviceOrientationDidChangeNotification 
              object:nil]; 

Ensuite, vous pouvez faire pivoter votre point de vue lorsque vous détectez la rotation de l'appareil.

- (void)didRotate:(NSNotification *)notification { 
    UIDeviceOrientation orientation = [[notification object] orientation]; 

    if (orientation == UIDeviceOrientationLandscapeLeft) { 
     [xxxView setTransform:CGAffineTransformMakeRotation(M_PI/2.0)]; 
    } else if (orientation == UIDeviceOrientationLandscapeRight) { 
     [xxxView setTransform:CGAffineTransformMakeRotation(M_PI/-2.0)]; 
    } else if (orientation == UIDeviceOrientationPortraitUpsideDown) { 
     [xxxView setTransform:CGAffineTransformMakeRotation(M_PI)]; 
    } else if (orientation == UIDeviceOrientationPortrait) { 
     [xxxView setTransform:CGAffineTransformMakeRotation(0.0)]; 
    } 
} 
+1

ce que j'ai exactement besoin pouvez-vous me dire comment puis-je faire pivoter l'UIToolBar et UINavigationBar – Sam

+0

très utile! .. – Ahsan

+1

Cela a fonctionné comme un charme. Mais il y a toujours un problème avec la barre d'état? Comment puis-je le faire pivoter avec l'orientation de l'appareil? –

5

J'ai également la situation lorsque j'ai besoin de tous les contrôleurs de vue en mode portrait, mais l'un d'entre eux peut également passer en mode paysage. Et ce contrôleur de vue a une barre de navigation. Pour cela, j'ai créé une deuxième fenêtre, dans mon cas, c'était un contrôleur de caméra. Et quand j'ai besoin d'afficher le contrôleur de la caméra, je montre la fenêtre de la caméra et je me cache quand j'ai besoin de pousser un autre contrôleur de vue.

Et vous devez également ajouter ce code à AppDelegate.

- (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window 
{ 
    if (window == self.cameraWindow) 
    { 
     return UIInterfaceOrientationMaskAllButUpsideDown; 
    } 

    return UIInterfaceOrientationMaskPortrait; 
} 
Questions connexes