我正在我的应用程序中实现自动旋转支持,这主要是一个子类化的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}}
普通视图==>旋转前调整大小的视图(我想拉伸它以覆盖黑色空间)
如何在动画播放之前展开新内容,并在结尾处展开? 或者,我应该采用完全不同的方式吗?动画调整所有元素的大小不是一种选择。
答案 0 :(得分:3)
毫无疑问,您应该就此问题咨询一个全面而明确的来源:WWDC2012,会议240,“抛光您的界面轮换”。
详细介绍了平滑旋转动画的一些技巧。
与我相关的主要问题可能是setShouldRasterize
中的willRotateToInterfaceOrientation:duration:
,在willAnimateRotationToInterfaceOrientation:duration:
中配置所需动画,然后关闭shouldRasterize
didRotateFromInterfaceOrientation:
。