ios - 使用 OpenGL 自定义 iOS 界面方向更改动画

标签 ios animation opengl-es interface-orientation

我有一个 iPad 应用程序,正在使用 openGL 绘制主视图,我想在设备旋转时为自己的更改设置动画。

请注意,此应用程序只是偶尔绘制,而不是持续动画。我的场景也是(非常复杂的)2D 绘图,而不是 3D。我只是希望它在设备方向更改期间简单地围绕显示中心旋转,保持正确的纵横比。

目前我只有以下代码:

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
{
    // nothing yet
}

- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation
{
    IMMainView *mv = (IMMainView *)self.view;
    [mv createRenderbuffer];
    [mv drawView];
}

旋转完成后,我只是重新创建 OpenGL 渲染缓冲区以匹配新的宽度和高度。

默认的 iOS 行为似乎会旋转 View ,但也会随着纵横比的变化而奇怪地拉伸(stretch)它。

我可以为我的绘图参数设置动画,以便在过渡期间更好地显示某些内容,但我不明白 (1) 如何停止 iOS 为我的图层设置动画以及 (2) 如何通过这些方法调用设置动画循环匹配 iOS 动画。

例如,在动画播放过程中,实际的 View 宽度和高度是否在逐渐变化?

还有一个可能的问题是何时重新创建渲染缓冲区的问题,因为如果 OpenGL 缓冲区与 iOS View 边界不匹配,则像素纵横比不正确并且绘图看起来很糟糕。

如有任何帮助,我们将不胜感激。

最佳答案

我花了一些时间研究正确执行此操作的合理方法,最终采用了最简单的方法,即在 willRotateToInterfaceOrientation 上清除屏幕,然后以正确的方式呈现新内容放在 didRotateFromInterfaceOrientation 中。它看起来并没有那么糟糕,恕我直言,为了更好的东西而额外的复杂性是不值得的。

或者,虽然我没有选择这个解决方案,但我用不多的工作实现的最好的动画效果是这样的:

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
{
    IMMainView *mv = (IMMainView *)self.view;
    [mv drawBlankScreen];

    m_oldviewsize = self.view.bounds.size;
}

- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation duration:(NSTimeInterval)duration
{
    IMMainView *mv = (IMMainView *)self.view;

    CGPoint neworigin = mv.origin;

    neworigin.x += 0.5f*(self.view.bounds.size.width - m_oldviewsize.width);
    neworigin.y += 0.5f*(self.view.bounds.size.height - m_oldviewsize.height);

    mv.origin = neworigin;

    [mv createRenderbuffer];
    [mv drawView];
}

更改原点旨在将旋转后的绘图重新置于旋转前的同一位置。

我发现 willAnimateToInterfaceOrientation 在计算出新的 View 边界后被调用一次。因此,我在那个时候设置了新的渲染缓冲区,因为与纵横比变化相关的失真不像我原来的情况那么明显。我还必须在 willRotateToInterfaceOrientation 中清除屏幕,因为在延迟期间原始绘图的扭曲版本清晰可见。

这样做的缺点是清屏会导致动画开始时出现轻微的闪光,并且拉伸(stretch)失真仍然存在但会聚到正确的外观上,而不是从旧的外观上发散跳到新的外观,所以它看起来不那么糟糕。我怀疑任何尝试通过使用我的绘图函数进行更新以持续保持正确外观来实际跟踪 View 的动画纵横比变化的尝试实现起来会非常复杂,并且很可能很容易受到 Apple future 变化的影响。

关于ios - 使用 OpenGL 自定义 iOS 界面方向更改动画,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15125327/

相关文章:

ios - swift 中的 XMPPFramework 错误

ios - 在呈现另一个 View Controller 时,如何阻止 "from" View 变黑?

jquery - 上下滚动时的CSS动画

android - 为形状的笔触宽度设置动画

javascript - Canvas 条形图动画

ios - 使用 'case let x = y as NSString 发生内存泄漏

ios - 为什么 UIButton 框架被 setTitle : forState: method 重置

java - 使用函数 glGenerateMipmap() 初步创建 mipmap

ios - OpenGL 改变方向导致 iPad 重启

使用 OpenGL 处理 Android 相机帧