3

我正在使用 iOS 6 和 Xcode 4.5 在 Storyboard 中开发一个带有标签栏和一些导航视图控制器的应用程序

通常应用程序应该支持所有界面方向,但我有两个只应该支持纵向模式的视图。

所以我在视图控制器中添加了以下代码:

-(BOOL)shouldAutorotate
{
    return NO;
}

-(NSUInteger)supportedInterfaceOrientations
{
    return UIInterfaceOrientationPortrait;
}

在我在 iOS 6 上开发的另一个没有故事板和导航视图控制器的应用程序上,它可以工作,但她不行!:/

我希望有人可以提供帮助,因为我发现了其他一些没有帮助的帖子...

德国致以最诚挚的问候

劳伦兹

编辑:

我也试过 - 不起作用!:

- (NSUInteger)supportedInterfaceOrientations
{
    return UIInterfaceOrientationMaskPortrait;

} 
4

2 回答 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

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

-(BOOL)shouldAutorotate {
    return NO;
}

-(NSUInteger)supportedInterfaceOrientations {
    return UIInterfaceOrientationMaskPortrait;
}
于 2013-02-22T11:28:39.923 回答
0

乔纳森的出色回答。

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

- (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;
    }
} 
于 2014-04-13T07:38:48.510 回答