平滑的自转动画

时间:2012-12-11 00:37:03

标签: ios

我正在我的应用程序中实现自动旋转支持,这主要是一个子类化的UIScrollView,可以执行一些特殊的操作(第一张图像)。主layoutSubviews上会调用UIView,而layoutSubviews会调用scrollview的layoutSubviews。这会将内容调整为新方向的边界,如预期的那样(第二张图像)。然后发生旋转动画。因此,用户在旋转设备之后但在新调整大小的内容旋转到其最终位置之前,会在视图周围看到丑陋的死区。

我的应用程序被编写为其内容已关闭隐式动画,因此UIScrollView完成的大小调整是即时的。 (否则,我相信那里发生的任何事情都会随着旋转而动画化。)从我的角度来看最简单的事情(并给出应用程序的视觉内容)是为新方向调整大小,然后将其拉伸为看起来像旧方向,然后在视图旋转到位时动画撤消该拉伸。这不起作用:对transform UIView属性的调整搞砸了其内部几何概念,其父transform似乎会覆盖其willRotateToInterfaceOrientation的更改我在viewWillLayoutSubviews制作它们。在willrotate start, main transform [1, 0, 0, 1, 0, 0] (untouched) willrotate end, main transform [4, 0, 0, 0.25, 0, 0] (trying to stretch it arbitrarily) willlayout, main transform [0, 1, -1, 0, 0, 0] (my stretch was overwritten by rotation; animation block has already started) didlayout, main transform [0, 1, -1, 0, 0, 0] willanim, main trasform [0, 1, -1, 0, 0, 0] didrotate, main transform [0, 1, -1, 0, 0, 0] 或更高版本中进行的任何变换都是动画的,所以到那时我已经需要撤消我之前制作的拉伸:

{{1}}

普通视图==>旋转前调整大小的视图(我想拉伸它以覆盖黑色空间)

Normal portrait view After resize, before rotation

如何在动画播放之前展开新内容,并在结尾处展开? 或者,我应该采用完全不同的方式吗?动画调整所有元素的大小不是一种选择。

1 个答案:

答案 0 :(得分:3)

毫无疑问,您应该就此问题咨询一个全面而明确的来源:WWDC2012,会议240,“抛光您的界面轮换”。

详细介绍了平滑旋转动画的一些技巧。

与我相关的主要问题可能是setShouldRasterize中的willRotateToInterfaceOrientation:duration:,在willAnimateRotationToInterfaceOrientation:duration:中配置所需动画,然后关闭shouldRasterize didRotateFromInterfaceOrientation: