UIViewController 容器:允许孩子有不同的方向

Posted

技术标签:

【中文标题】UIViewController 容器:允许孩子有不同的方向【英文标题】:UIViewController container: allow different orientations for childs 【发布时间】:2012-12-10 15:44:48 【问题描述】:

已更新:是否可以将一个 UIViewController (vc1) 作为容器,将一个 UIViewController 作为孩子 (vc2)

[vs1 addChildViewController:vc2];
[vs1.view addSubview:vc2.view];

并允许vc2 中的方向更改独立于vc1 支持的方向?

F.e vc1 仅支持纵向,但 vc2 支持所有方向。 我想看到vc2 视图旋转到横向,同时vc1 视图仍然是纵向的。

我有 VC1 和 VC2(弹出窗口)

VC1 仅支持纵向,而 VC2 支持所有方向。

我想在弹出窗口中设置横向

【问题讨论】:

如果父视图不旋转,为什么要让弹出窗口旋转?就因为可以?或者是否有一个有用的用例? 相信我,这对我很有用;) 【参考方案1】:

父视图控制器检测到方向。我使用的方法是在父视图控制器中,检测哪个视图是当前活动视图,然后根据它进行定位。

【讨论】:

@Injectios 你能贴一张你的视图的截图吗?【参考方案2】:

抱歉,标准行为无法实现您想要的。当 childViewController 支持某个方向时,它的父级和当前层次结构中的所有其他 ViewController 也必须支持该方向。

您应该做的是注册 parentViewController 以接收设备旋转通知,然后基于这些您可以转换 childViewController 的视图。因此,基本上您的应用将始终保持纵向模式,但 childViewController 的视图将被转换为看起来像在横向模式。

像这样注册设备方向通知

[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
[[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(deviceDidRotate:) name: UIDeviceOrientationDidChangeNotification object: nil];

那就这样处理

// This method gets called everytime the device (!), not the viewController rotates
-(void)deviceDidRotate: (NSNotification*) notification

    UIDeviceOrientation orientation = [[UIDevice currentDevice] orientation];

    // Animate the transform here based on the orientation

请记住,UIDeviceOrientation 和 UIInterfaceOrientation 是相反的。 UIDeviceOrientationLandscapeLeft = UIInterfaceOrientationLandscapeRight。设备向左旋转,因此用户界面必须向右旋转。

【讨论】:

是的,我正在考虑手动旋转我孩子的视图,但是自动调整蒙版等呢?

以上是关于UIViewController 容器:允许孩子有不同的方向的主要内容,如果未能解决你的问题,请参考以下文章

UINavigationController 和 UIViewController 的导航控制器属性

在允许孩子捕捉触摸的同时防止父母被点击

如果孩子不存在,则隐藏父容器:可见

UIViewController 遏制 - 新孩子不知道旋转

子 UIViewController 视图阻止容器 UIViewController 视图接收触摸事件

故事板中的 UIViewController 容器