我想创建一个当我调用 shouldAutorotateToInterfaceOrientation 时不会旋转的 UIVIew,其他子视图也会旋转。
我想保留 shouldAutorotateToInterfaceOrientation 支持,而不是使用通知。
谢谢
我想创建一个当我调用 shouldAutorotateToInterfaceOrientation 时不会旋转的 UIVIew,其他子视图也会旋转。
我想保留 shouldAutorotateToInterfaceOrientation 支持,而不是使用通知。
谢谢
当设备旋转时,请务必通过“不旋转”视图来准确定义您的意思。旋转可能意味着几件事,具体取决于您所指的坐标系。一个更好的思考方式很简单,你希望你的视图在每个设备方向上看起来像什么。
提醒一下, shouldAutorotateTo... 由系统发送到您的视图控制器。你不会自己调用它。它不会导致旋转。它让系统询问您的视图控制器它支持什么方向。
你的 VC 应该对它支持的所有方向回答“是”。支持的方向是视图响应设备方向更改而更改布局的方向,因此如果给定方向发生任何布局更改,则 shouldAutorotateTo 的答案可能是 YES。
更改给定界面方向的子视图布局主要是您的责任。视图有一个 autoresizingMask,它是一个位向量,描述了一些相对于其父级的大小和定位选项,这通常就足够了。完全控制方向变化布局的方法是实现 willAnimateRotationToInterfaceOrientation。
例如,这是一个相当宽松的 shouldAutorotate,除了一个方向外,所有方向都可以......
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
}
这是您如何控制子视图在旋转时布局的方式...
- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {
UIView *testView = [self.view viewWithTag:16];
if (UIInterfaceOrientationIsLandscape(toInterfaceOrientation)) {
// change frames here to make the ui appear according to your spec
// including however you define "not rotating" for each view
self.subviewA.frame = .....
self.subviewB.frame = .....
} else {
self.subviewA.frame = .....
self.subviewB.frame = .....
}
}
如果您希望一个 UIView 不随方向旋转,一种简单的解决方案是将该视图添加到应用程序顶部窗口,如下所示。因为窗口不随设备方向旋转。
[[[[UIApplication sharedApplication]windows]objectAtIndex:0]addSubview:customView];