我在我的应用程序中实现了自动旋转支持,它主要是一个子类 UIScrollView,它做了很多特殊的事情(第一张图片)。layoutSubviews
在 main 上UIView
调用,后者又调用滚动视图的layoutSubviews
. 正如预期的那样(第二张图片),这会将内容调整为新方向的边界。然后发生旋转动画。结果,用户在旋转设备之后但在新调整大小的内容旋转到其最终位置之前,会在视图周围看到丑陋的死区。
我的应用程序是这样编写的,它的内容关闭了隐式动画,因此调整大小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]
普通视图 ==> 旋转前调整大小的视图(我想拉伸它以覆盖黑色空间)
如何在动画之前拉伸新内容,并在最后不拉伸?或者,我应该以完全不同的方式来做这件事吗?动画调整所有元素的大小不是一种选择。