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

Posted

技术标签:

【中文标题】iOS 自定义容器 VC 和需要特定方向的子级【英文标题】:iOS Custom Container VC and children requiring a specific orientation 【发布时间】:2013-02-11 18:46:07 【问题描述】:

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

在我的项目中,我有一个使用 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】:

在大多数情况下,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];

【讨论】:

以上是关于iOS 自定义容器 VC 和需要特定方向的子级的主要内容,如果未能解决你的问题,请参考以下文章

来自自定义 LinearLayout 的子级不显示波纹效果

flexbox + bootstrap 4. 如何拉伸 .col-**-* 的子级?

MaterialAlertDialogBu​​ilder 崩溃并显示错误:使用自定义视图时,指定的子级已经有父级

php 将自定义模板分配给具有特定类别(和子级)的帖子。

ios uiviewcontroller uitabbarcontroller 的子级

Vue的自定义组件之间的数据传递