扩展 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】:
如果你愿意,你可以扩展任何类,但你所要求的能力并不容易达到那么多。因为CALayer
s 不是UIView
s 和UIViewAnimation...
不适用于它们(PS:Apple 最近添加了对cornerRadius 和其他一些图层属性的某种支持,但不是全部)。
动画内容需要你更多地了解动画逻辑,如帧、关键帧和时间轴等。一旦你学会了这些,你就可以自己制作复杂的关键帧动画。
- 提示:石英
有一些工具可以通过他们的 GUI 让动画制作变得更加容易,例如 QuartzCode。当超级复杂的动画像这样出现时,我个人会使用它:
但不适用于像这样的简单关键帧动画:
希望对您有所帮助。
【讨论】:
以上是关于扩展 UIViewPropertyAnimator?的主要内容,如果未能解决你的问题,请参考以下文章
为啥在 UIViewPropertyAnimator 中使用“unowned”
完成块内的 UIViewPropertyAnimator 状态?
NSLayoutConstraints 的 UIViewPropertyAnimator 使视图消失