iOS 6 Tab Bar 应用:shouldAutorotate 不起作用

3
我正在使用iOS 6和Xcode 4.5开发一个带有选项卡和一些导航视图控制器的应用程序。
通常,应用程序应支持所有界面方向,但我有两个视图只支持纵向模式。
因此,我在视图控制器中添加了以下代码:
-(BOOL)shouldAutorotate
{
    return NO;
}

-(NSUInteger)supportedInterfaceOrientations
{
    return UIInterfaceOrientationPortrait;
}

在我开发的另一个没有使用故事板和导航视图控制器的iOS 6应用程序中,它能够运行,但在这个应用程序中却不能!希望有人能够帮忙,因为我发现其他一些帖子并不是很有用...来自德国最好的问候,Laurenz。
编辑:我也尝试了 - 不起作用!:
- (NSUInteger)supportedInterfaceOrientations
{
    return UIInterfaceOrientationMaskPortrait;

} 
2个回答

6
据我所知,这个问题的原因在于UITabBarController和UINavigationController会返回它们自己的默认值来实现-(BOOL)shouldAutorotate和-(NSUInteger)supportedInterfaceOrientations。
一种解决方法是通过分类(或子类化)扩展这两个类,以便在您的视图控制器中使用自己的方法来返回适当的值。这就是对我有效的方法(您可以将其直接放入您的App Delegate中)。
@implementation UITabBarController(AutorotationFromSelectedView)

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

- (NSUInteger)supportedInterfaceOrientations {
    if (self.selectedViewController) {
        return [self.selectedViewController supportedInterfaceOrientations];
    } else {
        return UIInterfaceOrientationMaskAllButUpsideDown;
    }
}

@end

@implementation UINavigationController(AutorotationFromVisibleView)

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

- (NSUInteger)supportedInterfaceOrientations {
    if (self.visibleViewController) {
        return [self.visibleViewController supportedInterfaceOrientations];
    } else {
        return UIInterfaceOrientationMaskAllButUpsideDown;
    }
}
@end

默认情况下,所有的视图控制器都将继续自动旋转。在仅支持纵向模式的两个视图控制器中,实现以下内容:

-(BOOL)shouldAutorotate {
    return NO;
}

-(NSUInteger)supportedInterfaceOrientations {
    return UIInterfaceOrientationMaskPortrait;
}

我在appdelegate.m和viewcontroller.m中实现了你的代码。现在它锁定了viewcontroller.m的横向模式,但是当我从先前的视图切换到viewcontroller.m的横向模式时,它会显示横向模式的屏幕,并且这一次它不会更改为纵向模式。 - mohsin.mr
这是正确的答案。我一直在处理这个问题,将UITab和UINav分类解决了它。你应该将这个答案标记为正确的。 - Dave Thwaites
我已经扩展了这段代码,以支持UISplitViewController:https://gist.github.com/cameroncooke/a9244bc4d677f50940f5 - Camsoft

0

Jonathan 的答案非常好。

我稍微修改了他的代码,以便在单个片段中处理导航控制器。

- (BOOL)shouldAutorotate {
    if (self.selectedViewController) {
        if ([self.selectedViewController isKindOfClass:[UINavigationController class]]) {
            return [[[(UINavigationController*)self.selectedViewController viewControllers] lastObject] shouldAutorotate];
        }
        return [self.selectedViewController shouldAutorotate];
    } else {
        return YES;
    }
}

- (NSUInteger)supportedInterfaceOrientations {
    if (self.selectedViewController) {
        if ([self.selectedViewController isKindOfClass:[UINavigationController class]]) {
            return [[[(UINavigationController*)self.selectedViewController viewControllers] lastObject] supportedInterfaceOrientations];
        }
        return [self.selectedViewController supportedInterfaceOrientations];
    } else {
        return UIInterfaceOrientationMaskAllButUpsideDown;
    }
} 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接