3

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

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

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

在 segue 期间加载代替第一个视图控制器的第二个视图控制器具有条件方向。视图控制器本质上是一个视图控制器,其中包含一个UIPageViewController用于显示 PDF 页面的视图控制器。条件方向是 PDF 的方向。如果 PDF 为横向或PDF 为纵向,则该方法-(NSUInteger)supportedInterfaceOrientations返回。这个方法确实被调用了。然而,在我的 segue 中,我呼吁:UIInterfaceOrientationMaskLandscapeUIInterfaceOrientationMaskPortrait

[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];,但这个应用程序可能会成为商店应用程序,所以我正在避免这种情况。

欢迎任何建议。

4

1 回答 1

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];
于 2013-05-22T03:32:57.097 回答