【发布时间】:2020-01-02 02:51:04
【问题描述】:
假设你有一个简单的动画
let e : CABasicAnimation = CABasicAnimation(keyPath: "strokeEnd")
e.duration = 2.0
e.fromValue = 0
e.toValue = 1.0
e.repeatCount = .greatestFiniteMagnitude
self.someLayer.add(e, forKey: nil)
一层
private lazy var someLayer: CAShapeLayer
很容易读取每个动画步骤的 strokeEnd 值。
只需更改为自定义层
private lazy var someLayer: CrazyLayer
然后
class CrazyLayer: CAShapeLayer {
override func draw(in ctx: CGContext) {
print("Yo \(presentation()!.strokeEnd)")
super.draw(in: ctx)
}
}
如果真的能够在每一步设置图层的属性值,那将是非常方便的。
例子:
class CrazyLayer: CAShapeLayer {
override func draw(in ctx: CGContext) {
print("Yo \(presentation()!.strokeEnd)")
strokeStart = presentation()!.strokeEnd - 0.3
super.draw(in: ctx)
}
}
你当然不能那样做——
试图修改只读层
也许你可以有一个自定义的动画属性
class LoopyLayer: CAShapeLayer {
@NSManaged var trick: CGFloat
override class func needsDisplay(forKey key: String) -> Bool {
if key == "trick" { return true }
return super.needsDisplay(forKey: key)
}
... somehow for each frame
strokeEnd = trick * something
backgroundColor = alpha: trick
}
如何“手动”设置动画属性的值,每一帧?
有没有办法简单地提供(覆盖?)一个计算每帧值的函数?如何根据其他属性或其他自定义属性的计算,在某些属性上为每帧设置值?
(脚注 1 - 一个 hacky 解决方法是滥用关键帧动画,但这并不是重点。)
(脚注 2 - 当然,通常最好使用 CADisplayLink 以普通的老式手动方式简单地制作动画,而不用担心 CAAnimation,但这个 QA 是关于 CAAnimation 的。)
【问题讨论】:
-
你知道如何暂停动画吗?在这里搜索一下,可以找到很多信息。
-
嗨@E.Coms!我想你根本不明白这里问的是什么。
-
我知道你的意思,但你不能用公共 API 来做到这一点。所以这些方法并不安全。
标签: ios swift caanimation