UIViewPropertyAnimator
对于修改视图的变换、alpha 等非常方便。但是,有时您希望为CAShapeLayer
路径设置动画,或者UIImageView
更改图像。有什么方法可以扩展 UIViewPropertyAnimator 的功能以支持其他属性?如果没有,我如何将单独的动画与复杂的关键帧动画同步?
3 回答
我想添加对这个主题的引用。如果您需要自定义属性。如果您完全了解发生了什么,这个问题将帮助您。 如何在 CALayer 中为 UIColor 设置动画?
如果你弄清楚了,你可以实现
fractionComplete: CGFloat 很容易。
但首先你必须了解动画/动作/委托是如何进行的。所有的答案都在那里,但需要时间来理解。
处理所有情况是一个漫长的故事。正如你所说,这很方便,但留给勤奋的人。
如果您愿意,您可以扩展任何课程,但您所要求的能力并不容易达到那么多。因为CALayer
s 不是UIView
s 并且UIViewAnimation...
不适用于它们(PS:Apple 最近添加了对cornerRadius 和其他一些图层属性的某种支持,但不是全部)。
动画内容需要您更多地了解动画逻辑,例如框架和关键帧以及时间线等。一旦您了解了这些内容,您就可以自己制作复杂的关键帧动画。
- 提示:石英
有一些工具可以通过他们的 GUI (如QuartzCode )使动画制作变得更加容易。当超级复杂的动画像这样出现时,我个人会使用它:
但不适用于像这样的简单关键帧动画:
希望能帮助到你。
UIViewPropertyAnimator
易于使用。然而,这种简单性伴随着严重的限制。根据文档,它只能用于直接为视图设置动画。这不包括 CAShapeLayer 的属性。
那么,您可以使用什么制作动画UIViewPropertyAnimator
?此列表中的所有内容:
- 框架
- 界限
- 中央
- 转换
- α
- 背景颜色
- 内容拉伸
如果要为 设置动画CAShapeLayer
,则必须CoreAnimation
改用。虽然使用起来更复杂,但幸运的是它还允许您组合动画。
例如,如果你想同时运行两个动画,你可以使用CAAnimationGroup
这样的:
let fadeOut = CABasicAnimation(keyPath: "opacity")
fadeOut.fromValue = 1
fadeOut.toValue = 0
fadeOut.duration = 1
let expandScale = CABasicAnimation()
expandScale.keyPath = "transform"
expandScale.valueFunction = CAValueFunction(name: kCAValueFunctionScale)
expandScale.fromValue = [1, 1, 1]
expandScale.toValue = [3, 3, 3]
let fadeAndScale = CAAnimationGroup()
fadeAndScale.animations = [fadeOut, expandScale]
fadeAndScale.duration = 1
您还可以检测动画何时完成并使用它来启动另一个动画。有两种方法可以做到这一点:
可以动画的列表比 UIViewPropertyAnimator 的列表要长得多。你可以在这里找到它。