ios - 流畅的自转动画

标签 ios

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

我的应用程序是这样写的,它的内容已经关闭了隐式动画,所以 layoutSubviews 的大小调整是即时的。 (否则,我相信那里发生的任何事情都会随着旋转而动画化。)从我的角度来看(并考虑到应用程序的视觉内容)最简单的事情是调整新方向的大小,然后拉伸(stretch)它看起来像旧方向,然后在 View 旋转到位时动画撤消该拉伸(stretch)。这不起作用:对 UIScrollViewtransform 属性的调整搞砸了它的内部几何概念,而且它的父级 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)它以覆盖黑色空间)

Normal portrait view After resize, before rotation

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

最佳答案

毫无疑问,对于这个问题,您应该引用一个全面而权威的资源:WWDC2012,第 240 节,“完善您的界面旋转”。

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

我想到的最主要的可能与你相关的是在 willRotateToInterfaceOrientation:duration: 中调用 setShouldRasterize,在 willAnimateRotationToInterfaceOrientation:duration 中配置你想要的动画: 然后关闭 didRotateFromInterfaceOrientation: 中的 shouldRasterize

关于ios - 流畅的自转动画,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13811772/

相关文章:

ios - 当我得到以下内容时,为什么必须输入?

ios - 如何设置 UIActivityViewController Gmail 共享主题不同于正文

android - MonoTouch/MonoDroid 服务层不兼容?

ios - viewWillTransitionToSize :withTransitionCoordinator: called when app goes into the background or inactive

ios - 单击下拉菜单时如何调整 tableView 的高度?

iphone - 在 iOS 中以两种不同颜色设置按钮标题

ios - 在 Swift 4 中集成 LineChartView

ios - 将多个音频文件合并为一个

iphone - respondsToSelector 总是失败

ios - 从 Apple Watch 模拟器与 iPhone 设备通信