旋转一些UIViews,但不是全部?

时间:2011-02-25 13:23:20

标签: cocoa-touch opengl-es uikit rotation

我正在做一个应用程序,我有一个GLES视图,我不想自动旋转,UIKit视图,需要自动旋转

显然这不是你应该做的事情,因为我找不到任何好的文件。但是我完全相信这正是我想要的。

我找到了一个解决方案,但感觉很讨厌:

  1. 创建窗口。
  2. 创建一些自动旋转的UIViewControllers。
  3. 将他们的观点添加到窗口。
  4. 创建一个自动旋转的OpenGL ES视图控制器。
  5. 将其视图添加到窗口。
  6. 调用bringSubviewToFront:用于自动旋转的视图。
  7. 给自己一个高五,同时试图忽略这种唠叨的感觉,这实际上是一个讨厌的黑客。
  8. 任何人都知道更好的解决方案吗?注意:我绝对肯定我想要自动旋转UIKit视图而不是GL视图。

    感谢您的时间,非常感谢。 =)

4 个答案:

答案 0 :(得分:2)

我为类似的情况提出了不同的策略。在我的情况下,我允许所有视图旋转,但然后使用转换将我想要保持稳定的视图恢复到其原始方向。这是有效的,因为“非旋转”视图是方形的,但有了更多的数学,它也适用于其他形状。这是我放在willRotateToInterfaceOrientation:duration:

中的内容
switch (toInterfaceOrientation) {
    case UIInterfaceOrientationPortrait:
        steadyView.transform = CGAffineTransformIdentity;
        break;
    case UIInterfaceOrientationLandscapeLeft:
        steadyView.transform = CGAffineTransformMakeRotation(M_PI_2);
        break;
    case UIInterfaceOrientationPortraitUpsideDown:
        steadyView.transform = CGAffineTransformMakeRotation(M_PI);
        break;
    case UIInterfaceOrientationLandscapeRight:
        steadyView.transform = CGAffineTransformMakeRotation(3*M_PI_2);
        break;
}

steadyView是控制器的子视图。这似乎可以解决问题。

答案 1 :(得分:1)

没有比你提议的更好的方法来做到这一点。

您确定不仅要旋转OpenGL视图吗?如果您的应用程序仅限于ES 2.0设备以及之后的iOS 4.2,那么对OpenGL视图使用UIViewController轮换不会有任何性能损失。

答案 2 :(得分:0)

旋转后直接绘制OpenGL内容会不会更简单?只需在渲染器中应用旋转即可撤消OpenGL视图的旋转。

您可能会看到不可接受的跳回原始旋转,但您可以轻松解决这个问题。一旦视图完成旋转,您可以为返回旋转设置动画。或者,您可以覆盖willAnimateFirstHalfOfRotationToInterfaceOrientation:duration:willAnimateSecondHalfOfRotationFromInterfaceOrientation:duration:,以便在界面轮换期间为保留在原位的内容设置动画。

答案 3 :(得分:0)

所以我发现它在幕后是如何运作的; Frogblast是对的,没有任何更好的方法可以做到。

当视图被添加到没有子视图的窗口时,该视图的控制器自动成为“旋转权限”;如果该视图控制器从shouldAutorotateToInterfaceOrientation返回NO,则其他视图也不会旋转。但是,即使“旋转权限” 旋转,仍然允许旋转后续视图(使用控制器)添加到窗口中。

我不明白为什么他们这样做了,但你有它。