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

Rob*_*ugs 6 animation opengl-es interface-orientation ios

我有一个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];
}
Run Code Online (Sandbox Code Playgroud)

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

默认的iOS行为似乎会旋转视图,但随着宽高比的变化也会奇怪地延伸它.

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

例如,在动画期间,实际视图宽度和高度是否逐渐变化?

另外一个可能的问题是何时重新创建渲染缓冲区,因为如果OpenGL缓冲区与iOS视图边界不匹配,则像素纵横比不正确,图形看起来很糟糕.

任何帮助,将不胜感激.

Rob*_*ugs 3

我花了一些时间研究正确执行此操作的合理方法,最终采用了最简单的路线,即清除屏幕,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];
}
Run Code Online (Sandbox Code Playgroud)

原点的更改旨在将旋转后的图形重新居中到旋转前的同一位置。

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

这样做的缺点是,清除屏幕会导致动画开始时出现轻微的闪烁,并且拉伸扭曲仍然存在,但会收敛到正确的外观,不会偏离旧外观,然后跳转到新的外观。新的外观,所以看起来不那么糟糕。我怀疑任何尝试实际跟踪视图的动画长宽比变化并使用我的绘图函数进行更新以持续保持正确的外观的尝试都会非常复杂,而且很可能很容易受到苹果未来更改的影响。