iOS 8 个容器视图控制器 children 旋转
iOS 8 Container View Controller children rotation
我有一个自定义容器 UIViewController
。
该容器包含两个 children UIViewControllers
。
我需要为其中之一禁用旋转。
文档状态:
By default, rotation and appearance callbacks are automatically
forwarded to children.
但是-(BOOL)shouldAutorotate
从来没有被征召过children。
如何在 iOS8 中禁用 child 视图控制器的旋转?
在视图控制器中
- (NSUInteger)supportedInterfaceOrientations{
return UIInterfaceOrientationMaskPortrait;
}
我认为你做不到。当应用程序查询 viewController 支持的方向时,它只轮询其中一个方向,然后对整个 window 进行转换。我能建议的最好的方法是对有问题的 viewController 的容器视图进行仿射变换,以便 reverse/compensate 旋转。
您的问题可以更详细地确定您要实现的目标。这是一个答案,但鉴于问题有点含糊,我可能做出了一些错误的假设。
您引用的方法 -shouldAutoRotate
仅适用于顶级 viewController 的视图。相对而言,子视图不会旋转。但他们可能会根据新布局自行调整。
您可能想要做的是反向旋转 'static' 视图,使其相对于屏幕保持固定的纵横比。
您引用的文档指的是这些方法(pre-ios8)
– willRotateToInterfaceOrientation:duration:
– didRotateFromInterfaceOrientation:
在 ios8 中它们已被弃用并替换为
- viewWillTransitionToSize:withTransitionCoordinator:
如果您使用此方法,则必须检查 [UIDevice currentDevice]
的方向并进行反向旋转调整(这将是旋转变换)以适应。
如果这不适合您,始终可以制作自定义视图并让它(或 viewController)注册设备轮换通知。为此,您可以将 beginGeneratingDeviceOrientationNotifications
发送到 [UIDevice currentDevice]
,然后在通知中心注册这些通知:
[[NSNotificationCenter defaultCenter]
addObserver:self
selector:@selector(deviceOrientationDidChange)
name:UIDeviceOrientationDidChangeNotification object:nil];
编辑
"what about frame?"
什么关于框架?这与这里无关。您将对 'non-rotating' 视图应用旋转变换。 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
将 return 适当的旋转变换,而 centerForOrientation
将 return 从原始未旋转视图的中心坐标派生的中心。
使用 viewWillTransition
可以让您在界面旋转到新的设备方向之前 控制旋转 。此时 UIDeviceOrientation
将为您提供正确的目的地方向,而 UIInterfaceOrientation
仍将 return 旋转前的方位。如果你真的需要动画之间的紧密协调,你可以使用 UIViewControllerTransitionCoordinator 对象。
我有一个自定义容器 UIViewController
。
该容器包含两个 children UIViewControllers
。
我需要为其中之一禁用旋转。
文档状态:
By default, rotation and appearance callbacks are automatically forwarded to children.
但是-(BOOL)shouldAutorotate
从来没有被征召过children。
如何在 iOS8 中禁用 child 视图控制器的旋转?
在视图控制器中
- (NSUInteger)supportedInterfaceOrientations{
return UIInterfaceOrientationMaskPortrait;
}
我认为你做不到。当应用程序查询 viewController 支持的方向时,它只轮询其中一个方向,然后对整个 window 进行转换。我能建议的最好的方法是对有问题的 viewController 的容器视图进行仿射变换,以便 reverse/compensate 旋转。
您的问题可以更详细地确定您要实现的目标。这是一个答案,但鉴于问题有点含糊,我可能做出了一些错误的假设。
您引用的方法 -shouldAutoRotate
仅适用于顶级 viewController 的视图。相对而言,子视图不会旋转。但他们可能会根据新布局自行调整。
您可能想要做的是反向旋转 'static' 视图,使其相对于屏幕保持固定的纵横比。
您引用的文档指的是这些方法(pre-ios8)
– willRotateToInterfaceOrientation:duration:
– didRotateFromInterfaceOrientation:
在 ios8 中它们已被弃用并替换为
- viewWillTransitionToSize:withTransitionCoordinator:
如果您使用此方法,则必须检查 [UIDevice currentDevice]
的方向并进行反向旋转调整(这将是旋转变换)以适应。
如果这不适合您,始终可以制作自定义视图并让它(或 viewController)注册设备轮换通知。为此,您可以将 beginGeneratingDeviceOrientationNotifications
发送到 [UIDevice currentDevice]
,然后在通知中心注册这些通知:
[[NSNotificationCenter defaultCenter]
addObserver:self
selector:@selector(deviceOrientationDidChange)
name:UIDeviceOrientationDidChangeNotification object:nil];
编辑
"what about frame?"
什么关于框架?这与这里无关。您将对 'non-rotating' 视图应用旋转变换。 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
将 return 适当的旋转变换,而 centerForOrientation
将 return 从原始未旋转视图的中心坐标派生的中心。
使用 viewWillTransition
可以让您在界面旋转到新的设备方向之前 控制旋转 。此时 UIDeviceOrientation
将为您提供正确的目的地方向,而 UIInterfaceOrientation
仍将 return 旋转前的方位。如果你真的需要动画之间的紧密协调,你可以使用 UIViewControllerTransitionCoordinator 对象。