IO6 doesn't call -(BOOL)shouldAutorotate

2019-02-07 13:48发布

问题:

I have some views in my app that I don't want to suport orientation. In didFinishLaunchingWithOptions I add navigation:

...
UINavigationController *nav = [[UINavigationController alloc]initWithRootViewController:self.viewController];

    self.window.rootViewController = nav;
    [self.window makeKeyAndVisible];
...

In each ViewController I have UITabBar (I don't know if this is important).

In the first view controller I add:

-(BOOL)shouldAutorotate {
        return NO;
    }

    - (NSUInteger)supportedInterfaceOrientations {
        return UIInterfaceOrientationMaskPortrait;
    }

supportedInterfaceOrientations is called at the view loading but shouldAutorotate doesn't call as I rotate device.
What am I missing here?

回答1:

It's because neither UITabBarcontroller nor UINavigationController is passing shouldAutorotate to its visible view controller. To fix that you may subclass either UITabBarController or UINavigationController and forward shouldAutorotate from there:

In your subclassed UITabBarController add:

- (BOOL)shouldAutorotate
{
    return [self.selectedViewController shouldAutorotate];
}

In your subclassed UINavigationController add:

- (BOOL)shouldAutorotate
{
    return [self.visibleViewController shouldAutorotate];
}


回答2:

in the AppDelegate:

- (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window  // iOS 6
{

return UIInterfaceOrientationMaskAll;


}

in your ViewController:

- (BOOL)shouldAutorotate {
return YES;
}

- (NSUInteger)supportedInterfaceOrientations {
return UIInterfaceOrientationMaskPortrait;
}