0

我在我的应用程序中实现了自动旋转支持,它主要是一个子类 UIScrollView,它做了很多特殊的事情(第一张图片)。layoutSubviews在 main 上UIView调用,后者又调用滚动视图的layoutSubviews. 正如预期的那样(第二张图片),这会将内容调整为新方向的边界。然后发生旋转动画。结果,用户在旋转设备之后但在新调整大小的内容旋转到其最终位置之前,会在视图周围看到丑陋的死区。

我的应用程序是这样编写的,它的内容关闭了隐式动画,因此调整大小layoutSubviews是即时的。(否则,我相信那里发生的任何事情都会随着旋转而动画化。)从我的角度来看(并考虑到应用程序的视觉内容),最简单的事情是调整新方向的大小,然后将其拉伸为看起来像旧方向,然后在视图旋转到位时为该拉伸的撤消设置动画。这不起作用:对UIScrollView'transform属性的调整搞砸了它的内部几何概念,如果UIViewtransformwillRotateToInterfaceOrientation. 任何在或以后进行的变换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]

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

正常纵向视图 调整大小后,旋转前

如何在动画之前拉伸新内容,并在最后不拉伸?或者,我应该以完全不同的方式来做这件事吗?动画调整所有元素的大小不是一种选择。

4

1 回答 1

3

毫无疑问,对于这个问题,您应该咨询一个全面而明确的来源:WWDC2012,第 240 场会议,“抛光您的界面旋转”。

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

我想到的可能与您有关的主要问题是调用setShouldRasterizewillRotateToInterfaceOrientation:duration:配置您想要的动画,然后willAnimateRotationToInterfaceOrientation:duration:关闭shouldRasterizedidRotateFromInterfaceOrientation:

于 2012-12-11T01:04:51.580 回答