2

J'ai une application de barre d'onglets qui contient des vues de navigation dans 2 de ses onglets. Je souhaite que 1 vue dans le contrôleur de navigation 1 permette l'affichage paysage, mais à cause de la barre de navigation dans la limitation de la barre d'onglets, je dois maintenant autoriser les vues paysage pour chaque vue de mon application. Je ne veux pas.Limitation des vues de paysage dans UITabBarController contenant UINavigationController

Je pensais peut-être, sur les vues qui ne devraient pas aller au paysage, qu'il pourrait y avoir des façons de: empêcher le changement de vue par exemple. appeler setOrientation: UIDeviceOrientationPortrait chaque fois que l'appareil passe en mode paysage ou en donnant l'illusion que la vue ne change pas, par ex. présenter un portrait modal sur la vue inversée

Quelqu'un at-il des idées ou de l'expérience qu'il souhaite partager? Quelle est la meilleure approche ici? (Je ne veux pas avoir maintenant pour concevoir une vue de paysage pour chaque vue juste pour que je puisse afficher un portrait & paysage pour 1 vue)

Répondre

2

J'ai dû faire face au même problème récemment et ma solution est comme suit:

dans le UIViewController de la vue que vous voulez pouvoir tourner ajouter un gestionnaire de notification pour le UIDeviceOrientationDidChangeNotification

-(void)viewDidLoad { 


[[NSNotificationCenter defaultCenter] addObserver:self 
             selector:@selector(didRotateFromInterfaceOrientation) 
              name:@"UIDeviceOrientationDidChangeNotification" object:nil]; 

}

alors bien sûr, vous devez implémenter votre didRotateFromInterfaceOrientation méthode.

dans cette méthode, vous pouvez obtenir l'orientation actuelle à l'aide

UIDeviceOrientation orientation = [[UIDevice currentDevice] orientation]; 

ce que je faisais à côté était l'évaluation de la vue que je veux afficher, en fonction de l'orientation

switch (orientation) { 
    case UIDeviceOrientationLandscapeLeft: 
     NSLog(@"UIDeviceOrientationLandscapeLeft"); 
     [self presentModalViewController:LandscapeView animated:YES]; 

     break; 
    case UIDeviceOrientationLandscapeRight: 
     NSLog(@"UIDeviceOrientationLandscapeRight"); 

     [self presentModalViewController:LandscapeView animated:YES]; 

     break; 
    case UIDeviceOrientationPortraitUpsideDown: 
     NSLog(@"UIDeviceOrientationPortraitUpsideDown"); 
     [LandScapeview dismissModalViewControllerAnimated:YES]; 

     break; 
    case UIDeviceOrientationPortrait: 
     NSLog(@"UIDeviceOrientationPortrait"); 
     [LandscapeView dismissModalViewControllerAnimated:YES]; 
     break; 

    case UIDeviceOrientationFaceUp: 
     NSLog(@"UIDeviceOrientationFaceUp"); 

     break; 

    case UIDeviceOrientationFaceDown: 
     NSLog(@"UIDeviceOrientationFaceDown"); 
     break; 

    default: 
     break; 
    } 
} 

J'espère que je pourrais aider un peu.

+0

oh et ne pas oublier de retirer le gestionnaire de notification si la vue disparaît ... \t [[NSNotificationCenter defaultCenter] removeObserver: auto \t \t \t \t \t \t \t \t \t \t \t \t nom \t: @ "UIDeviceOrientationDidChangeNotification" \t \t \t \t \t \t \t \t \t \t \t \t objet: nil]; – samsam

+0

Je veux juste vérifier que je comprends, je laisserais toutes les autres vues comme ne pas prendre en charge le paysage et alors votre code ferait en sorte que les messages de changement d'orientation soient toujours reçus par le contrôleur rotatif, ai-je raison? –

+0

Oui, c'est correct. J'ai eu le même Problème: 5 Vues de Portrait (chacune est "vue de la racine" d'un NavigationController et accroché au TabBar) ... vous pouvez les laisser toutes intactes sauf celle qui est supposée changer de rotation. J'ai mis en place un Cover-Flow-View pour être affiché lors du changement de la rotation des appareils, cela fonctionne très bien. – samsam

Questions connexes