扩展 UIViewPropertyAnimator?

Posted

技术标签:

【中文标题】扩展 UIViewPropertyAnimator?【英文标题】:Extend UIViewPropertyAnimator? 【发布时间】:2017-10-24 22:45:31 【问题描述】:

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

【问题讨论】:

【参考方案1】:

我想添加对此主题的引用。如果您需要自定义属性。 如果您完全了解发生了什么,这个问题将帮助您。 How can I animate a UIColor in a CALayer?

想通了就可以实现了

fractionComplete: CGFloat 很容易。

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

处理所有情况是一个漫长的故事。就像你说的那样,很方便,但留给勤奋的人吧。

【讨论】:

我认为您走在正确的轨道上,但是通过解释其他答案的关键思想并将其用于UIViewPropertyAnimator 的上下文,确实可以改进答案。代码示例的奖励积分! 原因是代码实在是太长了。除非你确实需要它,否则不是练习的好例子。 ***.com/questions/18968629/… 这是展示实现的一种方式。 该页面上没有使用 UIViewPropertyAnimator 的代码。您指的是众多链接中的哪一个? 在一个答案中,有一个苹果例子来展示如何使用fractionComplete【参考方案2】:

UIViewPropertyAnimator 易于使用。然而,这种简单性伴随着严重的限制。根据documentation,它只能直接用于动画视图。这不包括 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

您还可以检测动画何时完成并使用它来启动另一个动画。有两种方法可以做到这一点:

使用completion block 实施CAAnimationDelegate

可以动画的列表比 UIViewPropertyAnimator 长得多。你可以找到它here。

【讨论】:

您的回答是一种非常奇特的说法,即它不起作用。 :) 但它仍然没有回答如何扩展UIViewPropertyAnimator 或与之同步单独动画的问题。 答案是,使用CoreAnimation。在那里,您可以为所需的属性设置动画,并且可以同步它们。这比尝试以某种方式同步 UIViewPropertyAnimator 更干净。除非有非常充分的理由保留 UIViewPropertyAnimator,否则重点是,这是预期的方式。 重点是,首先使用 UIViewPropertyAnimator 可能是有原因的(例如其他动画已经在使用它,复杂的时序等)。现在的问题是如何将基于 CALayer 的属性集成到其中。说根本不使用 UIViewPropertyAnimator 并不能回答 OP 的问题。【参考方案3】:

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

动画内容需要你更多地了解动画逻辑,如帧、关键帧和时间轴等。一旦你学会了这些,你就可以自己制作复杂的关键帧动画。

- 提示:石英

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

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

希望对您有所帮助。

【讨论】:

以上是关于扩展 UIViewPropertyAnimator?的主要内容,如果未能解决你的问题,请参考以下文章

为啥在 UIViewPropertyAnimator 中使用“unowned”

UIViewPropertyAnimator 的反弹效果

完成块内的 UIViewPropertyAnimator 状态?

NSLayoutConstraints 的 UIViewPropertyAnimator 使视图消失

UIViewPropertyAnimator 开头有短动画片段

UIViewPropertyAnimator - 简单地停止所有动画,而不是特定的?