Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

iOS 6 - (BOOL)shouldAutorotate not getting called for navigation controllers pushed viewControllers

For my app rootViewController is navgationController.

I found that pushed controller's

-(BOOL)shouldAutorotate is not getting called.

and

-(NSUInteger)supportedInterfaceOrientations get called only once.

I have checked correctly in xcode's project summary (or plist) for windows all orientation support.

I want these method to get called, as there is some uicontrol positioning code which i want to execute programmatically for orientation change.

I solved this problem by overriding (category) navigation controller's following methods

-(BOOL)shouldAutorotate;

-(NSUInteger)supportedInterfaceOrientations;

I checked which controller is getting pushed and accordingly called respective pushed controller's uicontrol positioning code in Navigation controller's following method

(NSUInteger)supportedInterfaceOrientations;

This is working fine but i dont think this is correct way. Please help me out for better solution.

like image 760
Aditya Deshmane Avatar asked Oct 10 '12 20:10

Aditya Deshmane


2 Answers

You can check the following link, you need to create custom navigation to support should auto rotate

http://mobileappdevpage.blogspot.in/2012/11/how-to-use-should-autorotateios-6-with.html

The other way you can do this by creating category of UINaviagationController

code for .h file is

@interface UINavigationController (autorotation)

-(BOOL)shouldAutorotate;
-(NSUInteger)supportedInterfaceOrientations;

and code for .m file is

@implementation UINavigationController (autorotation)

-(BOOL)shouldAutorotate
{

    UIInterfaceOrientation interfaceOrientation = [UIApplication sharedApplication].statusBarOrientation;
    [self.topViewController shouldAutorotate];
    return YES;

}

-(NSUInteger)supportedInterfaceOrientations
{
    return UIInterfaceOrientationMaskAll;

}
@end
like image 78
Shreesh Garg Avatar answered Sep 27 '22 17:09

Shreesh Garg


I also faced the same issue with the navigation controller. It works fine in the case of all the pushed view controllers, but my scenario was quite different I had one viewcontroller pushed in to the navigation controller (ViewControllerParent) as the root,

NavController
            -- rootViewController (ViewControllerParent)
                                          --- ViewControllerChild1
                                          --- ViewControllerChild2

Due to some project requirement, I was keeping the ViewControllerParent as base, and then I was adding Child viewcontroller's view as subviews to the parent based on user actions. Now I had a scenario where I wanted Child1 not to rotate and Child2 to have rotation.

The problem I faced was that my [self.topViewController] in the Navigation controller class always returns me the Parent Object since I am not pushing the Childs into the nav stack. So my shouldAutorotate methods in my Childs will never be called. So I had to put a class check in the shouldAutorotate method of my parent and then return the rotation value. I did something like this in parent class (ViewControllerParent),it is a kind of workaround but it fixed the issue

-(BOOL)shouldAutorotate
{
  BOOL allowRotation = YES;

   if ([currentlyLoadedChild isKindOfClass:[Child1 class]])
   {
       allowRotation = NO;
   }
   if ([currentlyLoadedChild isKindOfClass:[Child2 class]])
   {
       allowRotation = YES;
   }
   return allowRotation;
} 

-anoop

like image 35
anoop4real Avatar answered Sep 27 '22 17:09

anoop4real