1

我有这样的子类 UINavigationController :

- (BOOL)shouldAutorotate {

    if (self.topViewController != nil) return [self.topViewController shouldAutorotate];
    else return [super shouldAutorotate];
}

- (NSUInteger)supportedInterfaceOrientations {

    if (self.topViewController != nil) return [self.topViewController supportedInterfaceOrientations];
    else return [super supportedInterfaceOrientations];
}

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation {

    if (self.topViewController != nil) return [self.topViewController preferredInterfaceOrientationForPresentation];
    else return [super preferredInterfaceOrientationForPresentation];
}

supportedInterfaceOrientations并且shouldAutorotate在推入堆栈的每个视图控制器中都可以正常调用,但preferredInterfaceOrientationForPresentation仅在使用 iOS 7 时调用一次。preferredInterfaceOrientationForPresentation加载每个视图控制器时触发的任何想法都将不胜感激 =)

提前感谢,对不起我的英语=)

4

2 回答 2

1

我会自己回答。我将 UINavigationController 子类化以调用问题中发布的三个方法,然后将某些视图控制器推入堆栈,以将方向限制为纵向、横向或任何我想要的。问题是在视图控制器上没有调用preferredInterfaceOrientationForPresentation,因此它们没有以我想要的方向显示。为了强制 iOS 以一种或另一种方向呈现视图控制器,我检查 viewDidLoad 中的方向,如果它不是我想要的方向,我推送一个临时视图控制器,如下所示:

- (void)viewDidLoad {

    [super viewDidLoad];
    if([[UIDevice currentDevice] orientation] == UIDeviceOrientationLandscapeLeft || [[UIDevice currentDevice] orientation] == UIDeviceOrientationLandscapeRight) {

        TempViewController *temp = [[TempViewController alloc] init];
        [self.navigationController pushViewController:temp animated:YES];
    }
}

然后在 TempViewController 中:

- (void)viewDidLoad {

    [super viewDidLoad];
    [self.navigationController popViewControllerAnimated:YES];
}

结果是第一个视图控制器以在preferredInterfaceOrientationForPresentation 中指定的方向显示。也许这有点棘手,并且无法使用其他实现来完成,但至少这是可行的 =)

于 2013-09-25T08:57:57.130 回答
-1

你好这是我正在做的,你可以试试:

shouldAutorotate、supportedInterfaceOrientations 和 preferredInterfaceOrientationForPresentation 在 iOS 7 中无法按预期工作

这是一个很大的头痛。

快乐编码。

于 2013-12-16T12:03:51.577 回答