我有一个布局,屏幕分为两部分:顶部为UIView
,底部为GLKViewController
。问题是当屏幕方向改变时
GLKViewController
部分被旋转并逐渐伸展,直到动画结束,此时将绘制一个新的未拉伸框架。
有没有办法禁用GLKViewController
的自动旋转动画,所以我可以通过操纵模型视图 - 投影矩阵手动设置动画?
答案 0 :(得分:1)
如果您只是想要处理拉伸效果,则无需更换整个方向/旋转系统。根据您在应用程序用户界面中使用设备方向的程度,您可能会通过重新实现方向和旋转来增加维护工作量。 (如果你需要做的不仅仅是解决拉伸效应,其他答案仍然很好。)
您的视图在旋转动画期间自行绘制,因此您需要做的就是确保它在动画期间以与其中间大小匹配的方式绘制自身。旋转动画由Core Animation处理,因此您可以使用其presentationLayer
方法在动画期间访问临时状态。例如:
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);
将此片段作为更新/绘制循环的一部分运行 - 请注意,这可能意味着将投影矩阵的计算移动到更新/绘制循环中(如果它尚未存在)。 (如果正在进行方向更改,您可能还需要确保此代码段仅在每一帧运行。)
要查看正在进行的动画并确保其正常工作,请使用iOS模拟器中的“切换慢动画”命令。
(到期时:来自this answer。)
答案 1 :(得分:0)
GLKViewController
是UIViewController
的子类。 UIViewController
有一个方法willAnimateRotationToInterfaceOrientation:duration:
您可以覆盖它并配置视图动画。
您可以在文档中找到更多详细信息:Responding to View Rotation Events
部分下的UIViewController Class Reference。
答案 2 :(得分:0)
根据您想要实现的目标,您可以执行不同的操作来禁用自动旋转。
如果您根本不需要轮换,请在项目级别禁用它。在Xcode中,使用导航器选择项目(文件列表的顶部项目)并访问" General"目标应用程序的一部分。对于设备方向,取消除了" Portrait":
之外的所有内容
如果您需要为某些"屏幕"禁用它而不是其他人,您需要在UIViewController
级别禁用轮换。 UIViewController
最初设计用于占据整个屏幕区域,因此如果您使用管理GLKViewController
的{{1}}仅部分覆盖屏幕,则很可能是在另一个视图控制器内部。您需要子类化父视图控制器并添加以下方法:
GLKView
这些将阻止父视图控制器旋转。
最后,如果您需要允许旋转屏幕上的某些元素,而不允许其他元素旋转,那么您必须确定使用哪种方法:
// From iOS 6
- (BOOL)shouldAutorotate
{
return NO;
}
- (NSUInteger)supportedInterfaceOrientations
{
return UIInterfaceOrientationMaskPortrait;
}
// iOS 5
- (BOOL)shouldRotateToOrientation:(UIInterfaceOrientation)orientation
{
return NO;
}
属性手动旋转要旋转的元素。这就是我想要的。