0

我想创建一个当我调用 shouldAutorotateToInterfaceOrientation 时不会旋转的 UIVIew,其他子视图也会旋转。

我想保留 shouldAutorotateToInterfaceOrientation 支持,而不是使用通知。

谢谢

4

2 回答 2

3

当设备旋转时,请务必通过“不旋转”视图来准确定义您的意思。旋转可能意味着几件事,具体取决于您所指的坐标系。一个更好的思考方式很简单,你希望你的视图在每个设备方向上看起来像什么。

提醒一下, 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 = .....
    }
}
于 2012-07-08T16:55:48.797 回答
0

如果您希望一个 UIView 不随方向旋转,一种简单的解决方案是将该视图添加到应用程序顶部窗口,如下所示。因为窗口不随设备方向旋转。

[[[[UIApplication sharedApplication]windows]objectAtIndex:0]addSubview:customView];
于 2012-07-09T11:36:57.780 回答