0

Mon contrôleur de vue principal est un UITabBarController, avec 4 UINavigationControllers comme éléments de la barre d'onglets. Chaque barre de navigation est un couple de vues différentes qui sont poussées sur sa pile.Vue autorotate à l'intérieur de UITabBarController et UINavigationController

J'ai une seule vue que je veux autorotated, mais je ne peux pas obtenir willAnimateFirstHalfOfRotationToInterfaceOrientation à appeler dans ce contrôleur de vue.

J'ai essayé mon UITabBarController et le sous-classement UINaviationControllers et l'ajout d'un remplacement pour shouldAutorotateToInterfaceOrientation comme ceci:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 
{ 
    return YES; 
} 

Même après que je ne peux pas obtenir le point de vue de tourner. J'ai pensé que peut-être le plus haut UIViewController (onglet et navigation inclus) doit pouvoir tourner. Ou même chaque vue de la chaîne. J'ai essayé de surcharger shouldAutorotateToInterfaceOrientation pour chaque contrôleur mais ne peux toujours pas faire pivoter la vue.

Quelqu'un at-il accompli cela ou avez-vous des suggestions?

Merci d'avance!

Répondre

1

Outre le sous-classement de votre tabBarController que vous avez primordial houldAutorotateToInterfaceOrientation, vous devez faire ce qui suit:

Dans la méthode viewDidLoad du contrôleur dans lequel vous souhaitez ajouter une vue à être mis en rotation:

self.view.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; 

ajouter cette méthode déléguée dans le contrôleur dans lequel vous souhaitez ajouter une vue à tourner:

- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation 
{ 
    //NSLog(@"didRotateFromInterfaceOrientation"); 


    if((fromInterfaceOrientation == UIInterfaceOrientationPortrait) || 
     (fromInterfaceOrientation == UIInterfaceOrientationPortraitUpsideDown)) 
    {  

     YourAppDelegate *mainDelegate = (YourAppDelegate *)[[UIApplication sharedApplication] delegate]; 
    [mainDelegate.tabBarController.view addSubview: viewToBeRotated]; 

    [viewToBeRotated setHidden:NO]; 

    return; 

} 

if(fromInterfaceOrientation == UIInterfaceOrientationLandscapeLeft || fromInterfaceOrientation == UIInterfaceOrientationLandscapeRight) 
{ 
    [viewToBeRotated removeFromSuperview]; 
    [self.view setHidden:NO]; 
} 

}

Vous pouvez également ajouter la méthode suivante:

- (void)willAnimateFirstHalfOfRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation 
               duration:(NSTimeInterval)duration { 

if (toInterfaceOrientation == UIInterfaceOrientationPortrait) 
{ 
    //self.view = self.portrait; 
    YourAppDelegate *mainDelegate = (YourAppDelegate *)[[UIApplication sharedApplication] delegate]; 
    [viewToBeRotated removeFromSuperview]; 
    mainDelegate.tabBarController.view.transform = CGAffineTransformIdentity; 
    mainDelegate.tabBarController.view.transform = CGAffineTransformMakeRotation(degreesToRadian(0)); 
    mainDelegate.tabBarController.view.bounds = CGRectMake(0.0, 0.0, 300.0, 480.0); 

} 
else if (toInterfaceOrientation == UIInterfaceOrientationLandscapeLeft) 
{ 
    YourAppDelegate *mainDelegate = (YourAppDelegate *)[[UIApplication sharedApplication] delegate]; 
    [mainDelegate.tabBarController.view addSubview: viewToBeRotated]; 
    mainDelegate.tabBarController.view.transform = CGAffineTransformIdentity; 
    mainDelegate.tabBarController.view.transform = CGAffineTransformMakeRotation(degreesToRadian(-90)); 
    mainDelegate.tabBarController.view.bounds = CGRectMake(0.0, 0.0, 460.0, 320.0); 
} 
else if (toInterfaceOrientation == UIInterfaceOrientationPortraitUpsideDown) 
{ 


//self.view = self.portrait; 
     YourAppDelegate *mainDelegate = (YourAppDelegate *)[[UIApplication sharedApplication] delegate]; 
     [viewToBeRotated removeFromSuperview]; 
     mainDelegate.tabBarController.view.transform = CGAffineTransformIdentity; 
     mainDelegate.tabBarController.view.transform = CGAffineTransformMakeRotation(degreesToRadian(180)); 
     mainDelegate.tabBarController.view.bounds = CGRectMake(0.0, 0.0, 300.0, 480.0); 
    } 
    else if (toInterfaceOrientation == UIInterfaceOrientationLandscapeRight) 
    { 
     YourAppDelegate *mainDelegate = (YourAppDelegate *)[[UIApplication sharedApplication] delegate]; 
     [mainDelegate.tabBarController.view addSubview: viewToBeRotated]; 
     mainDelegate.tabBarController.view.transform = CGAffineTransformIdentity; 
     mainDelegate.tabBarController.view.transform = CGAffineTransformMakeRotation(degreesToRadian(90)); 
     mainDelegate.tabBarController.view.bounds = CGRectMake(0.0, 0.0, 460.0, 320.0); 
    } 
} 

Vous pouvez également jeter un oeil à

Rotating the iPhone, and instantiating a new UIViewController

TabBarController and navigationControllers in landscape mode

+0

Je suis en fait échangeant deux points de vue. J'ai essayé de régler l'autoResizingMask, mais cela ne fonctionne toujours pas. Les deux autres méthodes que vous suggérez devraient être prises en compte par la méthode my - willAnimateFirstHalfOfRotationToInterfaceOrientation. Il bascule self.view en fonction de l'orientation. Cette méthode n'est jamais appelée. – Rob

0

sous-classement UITabBarController et redéfinissant cette méthode travaillé:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 
{ 
    return YES; 
} 

Je pense que mon vrai problème était que XCode ne compilait pas le code mis à jour. J'ai fait construire propre, tactile et redémarré XCode et le simulateur et les changements finalement pris.

+0

Cela permettrait à tous les contrôleurs d'être en rotation, je suppose. – FelixLam

1

Vous pouvez utiliser un sous-classé UITabBarController (ou utiliser un ajout) qui demande à la NavigationController sélectionnée pour la réponse du visibleViewController à la demande de rotation:

@implementation RotatingTabBarController 
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { 
     if([self.selectedViewController isKindOfClass:[UINavigationController class]]){ 
      return [[(UINavigationController*)self.selectedViewController visibleViewController] shouldAutorotateToInterfaceOrientation:interfaceOrientation]; 
     } else { 
      return [self.selectedViewController shouldAutorotateToInterfaceOrientation:interfaceOrientation]; 
     } 
} 
@end 
+0

oups, seulement vu maintenant que c'est une vieille question – FelixLam

+0

sous-classe UITabBarController est découragé par apple. – hanno

Questions connexes