GLKViewController方向animation

我有一个布局,屏幕分为两部分:顶部的UIView和底部的GLKViewController 。 问题在于,当屏幕方向改变时, GLKViewController部件被旋转并逐渐拉伸,直到animation完成,此时将绘制新的未拉伸的框架。

有没有办法禁用GLKViewController的自动旋转animation,所以我可以通过操纵modelview投影matrix手动animation?

如果您只是想要处理拉伸效果,则无需更换整个方向/旋转系统。 取决于您在应用程序的用户界面中使用设备方向的次数,通过重新实现方向和旋转,您可能会导致更多的维护难题。 (如果你需要做的不仅仅是拉伸效应,其他的答案还是不错的。)

在旋转animation过程中,您的视图正在绘制自己,所以您只需确保在animation过程中以与中间大小相匹配的方式绘制自己。 旋转animation由Core Animation处理,因此您可以使用其presentationLayer方法在animation期间访问暂态。 例如:

 CALayer *presentationLayer = [self.view.layer presentationLayer]; CGSize layerSize = presentationLayer.bounds.size; float aspect = fabsf(layerSize.width / layerSize.height); GLKMatrix4 projectionMatrix = GLKMatrix4MakePerspective( GLKMathDegreesToRadians(65.0f), aspect, 0.1f, 100.0f); 

运行这个片段作为你的更新/绘制循环的一部分 – 注意这可能意味着如果你的投影matrix不存在,你的投影matrix的计算将移动到更新/绘制循环中。 (您可能还想确保此代码段仅在每个帧都运行,如果方向更改正在进行。)

要查看正在进行的animation并确保其正常工作,请使用iOS模拟器中的“切换慢animation”命令。

(信用到期:代码来自这个答案 。)

GLKViewControllerUIViewController一个子类。 UIViewController有一个方法willAnimateRotationToInterfaceOrientation:duration:你可以覆盖它并configuration视图的animation。

你可以在下面的文档中find更多的细节: UIViewController类参考下的Responding to View Rotation Events部分。

根据你想达到什么,你会做不同的事情来禁用自动旋转。

如果您根本不需要旋转,请在项目级别禁用它。 在Xcode中,使用导航器select项目(文件列表的顶部项目)并访问目标应用程序的“常规”部分。 取决于设备的方向,除了“肖像”以外的所有东西

设备定位列表

如果您需要禁用某些“屏幕”而不是其他,则需要在UIViewController级别禁用旋转。 UIViewController最初devise为占用整个屏幕区域,所以如果您使用GLKViewController来pipe理GLKView ,它只是部分覆盖屏幕,那么它最有可能在另一个视图控制器中。 您需要inheritance父视图控制器并添加这些方法:

 // From iOS 6 - (BOOL)shouldAutorotate { return NO; } - (NSUInteger)supportedInterfaceOrientations { return UIInterfaceOrientationMaskPortrait; } // iOS 5 - (BOOL)shouldRotateToOrientation:(UIInterfaceOrientation)orientation { return NO; } 

这些将阻止父视图控制器被旋转。

最后,如果您需要在屏幕上旋转某些元素,而不是其他元素,则必须确定使用哪种方法:

  • 让屏幕旋转,同时旋转要保持静态的元素。 我不会推荐它。
  • 如上所述阻止屏幕旋转,并通过设置其transform属性手动旋转要旋转的元素。 这是我会去的。