iOS自定义容器VC和需要特定方向的子项

时间:2013-02-11 18:46:07

标签: ios ipad uiviewcontroller

我已经尝试了很多方法来搜索这个问题的答案,但我看到的很多内容主要是在根视图控制器上锁定UINavigationController s的旋转问题。

在我的项目中,我使用View Controller Containment进行自定义UIViewController。我没有实现-(BOOL)shouldAutomaticallyForwardAppearanceMethods-(BOOL)shouldAutomaticallyForwardRotationMethods方法,因为它们的默认实现都已返回YES。已实施-(BOOL)shouldAutorotate并返回YES

显示的第一个视图控制器支持所有方向。这是按预期工作的。

在segue期间加载的第二个视图控制器具有条件方向。视图控制器本质上是一个视图控制器,其中包含用于显示PDF页面的UIPageViewController。条件方向是PDF方向的方向。如果PDF处于横向状态,则-(NSUInteger)supportedInterfaceOrientations方法会返回UIInterfaceOrientationMaskLandscape,如果PDF处于横向状态,则会返回UIInterfaceOrientationMaskPortrait。这个方法确实被调用了。然而,在我的segue期间,我打电话给:

[container transitionFromViewController:source 
           toViewController:dest 
           duration:1.0 
           options:UIViewAnimationOptionTransitionFlipFromRight 
           animations:^{} 
           completion:^(BOOL finished){/*relevant removal of vc's from parents*/}];

该方法调用我支持的方向,但它似乎不适用它们。我可以使用[[UIDevice currentDevice] performSelector:@selector(setOrientation:) withObject:(__bridge id)(void *)[dest preferredInterfaceOrientationForPresentation];,但此应用可能会成为商店应用,所以我避免这样做。

欢迎任何建议。

1 个答案:

答案 0 :(得分:0)

在大多数情况下,UINavigationController的答案应该让你进行设置。我过去曾经使用过一个技巧。在我的父VC中,我实现了以下方法:

- (UIViewController *)topViewController {
    return self.childViewControllers.lastObject;
}

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

- (NSUInteger)supportedInterfaceOrientations {
    return [[self topViewController] supportedInterfaceOrientations];
}

这将有点工作,但您必须先旋转到支持的方向,然后才能遵守第二个视图控制器的限制。诀窍是在- (BOOL)shouldAutorotate中返回NO,直到调用viewDidAppear:。像这样:

- (BOOL)shouldAutorotate {
    return _viewDidShow ? YES : NO;
}

然后在调用转换方法之前,请调用:

[[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationLandscapeLeft animated:NO];