2011-02-25 106 views
2

我正在做一个应用程序,我有一个GLES视图,我不想被自动旋转,并且UIKit视图在上面,其中需要自动旋转。旋转一些UIViews,但不是全部?

显然这不是你应该做的事情,因为我找不到任何好的文档。不过,我完全确定这正是我想要的。

我已经找到了解决办法,但感觉哈克:

  1. 创建窗口。
  2. 创建一些自动旋转的UIViewControllers。
  3. 将他们的意见添加到窗口。
  4. 创建一个OpenGL ES视图控制器而不是自动旋转。
  5. 将其视图添加到窗口中。
  6. 调用bringSubviewToFront:用于自动旋转的视图。
  7. 给自己一个高五,而试图忽略这种唠叨的感觉,这实际上是一个讨厌的黑客。

任何人都知道更好的解决方案?注意:我非常肯定我想自动旋转UIKit视图而不是GL视图。

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

回答

1

没有一个好的方法可以做得比您提出的要好。

你确定你不只是想旋转OpenGL视图吗?如果您的应用程序仅限于ES 2.0设备以及更高版本的iOS 4.2,那么在OpenGL视图中使用UIViewController旋转不会​​有任何性能损失。

0

旋转时画出OpenGL内容会不会更简单?只需在渲染器中应用旋转即可撤消OpenGL视图的旋转。

您可能会看到不可接受的跳回到原来的旋转,但您可以很容易地解决。视图旋转完成后,您可以为返回旋转设置动画。或者,您可以覆盖willAnimateFirstHalfOfRotationToInterfaceOrientation:duration:willAnimateSecondHalfOfRotationFromInterfaceOrientation:duration:以在界面旋转过程中保持原有内容的动画效果。

0

因此,我发现它是如何在幕后工作的; Frogblast是对的,没有任何实质上更好的方法来做到这一点。

发生什么事是,当一个视图被添加到没有子视图的窗口时,该视图的控制器自动成为“旋转权限”;如果该视图控制器从shouldAutorotateToInterfaceOrientation返回NO,则其他视图也不会旋转。然而,即使“旋转权限”确实旋转,仍然允许后续视图(与控制器)添加到窗口而不是旋转。

不清楚为什么他们这样做,但你有它。

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为s子视图。这似乎有伎俩。

相关问题