14

UIViewPropertyAnimator对于修改视图的变换、alpha 等非常方便。但是,有时您希望为CAShapeLayer路径设置动画,或者UIImageView更改图像。有什么方法可以扩展 UIViewPropertyAnimator 的功能以支持其他属性?如果没有,我如何将单独的动画与复杂的关键帧动画同步?

4

3 回答 3

2

我想添加对这个主题的引用。如果您需要自定义属性。如果您完全了解发生了什么,这个问题将帮助您。 如何在 CALayer 中为 UIColor 设置动画?

如果你弄清楚了,你可以实现

fractionComplete: CGFloat 很容易。

但首先你必须了解动画/动作/委托是如何进行的。所有的答案都在那里,但需要时间来理解。

处理所有情况是一个漫长的故事。正如你所说,这很方便,但留给勤奋的人。

于 2018-11-10T15:50:37.410 回答
1

如果您愿意,您可以扩展任何课程,但您所要求的能力并不容易达到那么多。因为CALayers 不是UIViews 并且UIViewAnimation...不适用于它们(PS:Apple 最近添加了对cornerRadius 和其他一些图层属性的某种支持,但不是全部)。

动画内容需要您更多地了解动画逻辑,例如框架和关键帧以及时间线等。一旦您了解了这些内容,您就可以自己制作复杂的关键帧动画。

- 提示:石英

有一些工具可以通过他们的 GUI (如QuartzCode )使动画制作变得更加容易。当超级复杂的动画像这样出现时,我个人会使用它:

石英码

但不适用于像这样的简单关键帧动画:

石英码2

希望能帮助到你。

于 2018-11-15T23:41:07.983 回答
1

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 的列表要长得多。你可以在这里找到它。

于 2018-11-10T13:02:18.873 回答