我已经尝试了很多方法来搜索这个问题的答案,但我看到的很多内容主要是在根视图控制器上锁定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];
,但此应用可能会成为商店应用,所以我避免这样做。
欢迎任何建议。
答案 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];