我正在我的应用程序中实现自动旋转支持,它主要是一个子类 UIScrollView,它执行大量特殊操作(第一张图片)。 layoutSubviews
在主 UIView
上调用,后者又调用 ScrollView 的 layoutSubviews
。这会将内容调整到新方向的边界,如预期的那样(第二张图片)。然后旋转动画发生。因此,在用户旋转设备之后但在新调整大小的内容旋转到其最终位置之前,用户会在 View 周围看到丑陋的死角。
我的应用程序是这样写的,它的内容已经关闭了隐式动画,所以 layoutSubviews
的大小调整是即时的。 (否则,我相信那里发生的任何事情都会随着旋转而动画化。)从我的角度来看(并考虑到应用程序的视觉内容)最简单的事情是调整新方向的大小,然后拉伸(stretch)它看起来像旧方向,然后在 View 旋转到位时动画撤消该拉伸(stretch)。这不起作用:对 UIScrollView
的 transform
属性的调整搞砸了它的内部几何概念,而且它的父级 UIView
似乎覆盖了如果我在 willRotateToInterfaceOrientation
中更改它的 transform
。在 viewWillLayoutSubviews
或更高版本中进行的任何转换都是动画的,因此到那时我已经需要撤消我之前进行的拉伸(stretch):
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]
普通 View ==> 旋转前调整 View 大小(我想拉伸(stretch)它以覆盖黑色空间)
如何在动画之前拉伸(stretch)新内容,并在结束时不拉伸(stretch)? 或者,我应该以完全不同的方式来做这件事吗?动画调整所有元素的大小不是一种选择。
最佳答案
毫无疑问,对于这个问题,您应该引用一个全面而权威的资源:WWDC2012,第 240 节,“完善您的界面旋转”。
它详细介绍了一些平滑旋转动画的技巧。
我想到的最主要的可能与你相关的是在 willRotateToInterfaceOrientation:duration:
中调用 setShouldRasterize
,在 willAnimateRotationToInterfaceOrientation:duration 中配置你想要的动画:
然后关闭 didRotateFromInterfaceOrientation:
中的 shouldRasterize
。
关于ios - 流畅的自转动画,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13811772/