我有一个自定义容器UIViewController
。
容器包含两个孩子UIViewControllers
。
我需要禁用其中一个的旋转。
文档说明:
默认情况下,自动旋转和外观回调 转发给孩子们。
但-(BOOL)shouldAutorotate
从未被要求过孩子。
如何在 iOS 8 中禁用子视图控制器的旋转?
答案 0 :(得分:3)
您的问题可以通过更详细的信息来确定您要实现的目标。这是一个答案,但鉴于问题有点含糊,我可能会做出一些错误的假设。
您引用的方法-shouldAutoRotate
仅适用于顶级viewController的视图。相对而言,子视图不会旋转。但他们可能会根据新的布局调整自己。
你可能想做的是反转“静态”视图,以便它保持与屏幕相关的固定方面。
您引用的文档是指这些方法(pre-ios8)
– willRotateToInterfaceOrientation:duration:
– didRotateFromInterfaceOrientation:
<\ n>在ios8中,它们已被弃用并替换为
- viewWillTransitionToSize:withTransitionCoordinator:
如果使用此方法,则必须检查[UIDevice currentDevice]
的方向并进行反向旋转调整(这将是旋转变换)以适应。
如果这对您不起作用,则始终可以创建自定义视图并让它(或viewController)注册设备旋转通知。为此,您需要将beginGeneratingDeviceOrientationNotifications
发送至[UIDevice currentDevice]
,然后在通知中心注册这些通知:
[[NSNotificationCenter defaultCenter]
addObserver:self
selector:@selector(deviceOrientationDidChange)
name:UIDeviceOrientationDidChangeNotification object:nil];
编辑
“框架怎么样?”
关于框架的内容是什么?这与此无关。您将对“非旋转”视图应用旋转变换。 Apple建议在应用变换后永远不要获取或设置帧属性,因为数字不再有意义。您可以改为设置边界和中心属性,或者 - 可能更好 - 使用自动布局约束或自动调整遮罩来获取结果。
EDIT2
以下是使用viewWillTransitionToSize
:
- (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator {
UIDeviceOrientation deviceOrientation =
[UIDevice currentDevice].orientation;
CGAffineTransform transform =
[self transformForOrientation:deviceOrientation];
CGPoint center =
[self centerForOrientation:deviceOrientation];
[UIView animateWithDuration:0.2 animations:^{
self.rotatingView.center = center;
self.rotatingView.transform = transform;
}];
}
其中transformForOrientation
将返回相应的旋转变换,centerForOrientation
将返回从原始未旋转视图的中心坐标派生的中心。
使用viewWillTransition
可以在界面旋转到新设备方向之前控制旋转。此时UIDeviceOrientation
将为您提供正确的目标方向,而UIInterfaceOrientation
仍将返回预先旋转的方面。如果动画之间需要非常紧密的协调,可以使用UIViewControllerTransitionCoordinator对象。
答案 1 :(得分:1)
在视图控制器中
- (NSUInteger)supportedInterfaceOrientations{
return UIInterfaceOrientationMaskPortrait;
}
答案 2 :(得分:1)
我认为你不能。当应用程序查询viewController以获取支持的方向时,它只轮询其中一个,然后对整个窗口进行转换。我能建议的最好的是对相关viewController的容器视图进行仿射变换,以便反转/补偿旋转。