【发布时间】:2017-11-07 18:12:23
【问题描述】:
想象一下CAGradientLayer。
为.startPoint 和.endPoint 制作动画非常容易。
现在想象一个浮点数spinLike,它只是同时设置它们两个。
{因此,您可以简单地为 spinLike 设置动画,而不是使用两个不同的动画。}
所以像..
class CustomGradientLayer: CAGradientLayer {
@objc var spinLike: CGFloat = 0 {
didSet {
startPoint = CGPoint( ... )
endPoint = CGPoint( ... )
setNeedsDisplay()
}
}
}
动画spinLike...
class Test: UIView {
...
g = CustomGradientLayer()
a = CABasicAnimation(keyPath: "spinLike")
...
g.add(a, forKey: nil)
...
但是。
不行,startPoint 和 endPoint 根本不动。
怎么了?
注意 - 可悲的是,您似乎不能 @NSManaged 具有 didSet 的属性...
注意 - 只需覆盖绘图循环,即可轻松制作自己的自定义动画。
这方面的例子很多。这就是你的做法:
class CircleProgressLayer: CALayer {
@NSManaged var progress: CGFloat
override class func needsDisplayForKey(key: String) -> Bool {
if key == "progress" {
return true
}
return super.needsDisplayForKey(key)
}
override func draw(in ctx: CGContext) {
path.fill() etc etc... your usual drawing code
}
}
很遗憾我的问题是
与实际绘图无关:
通过动画属性spinLike,
我只是想改变每一帧现有的普通动画属性(在示例中,.startPoint 和 .endPoint)
你是怎么做到的?
注意!您不能在 drawInContext 中更改 .startPoint 和 .endPoint - 您将成为 attempting to modify read-only layer
【问题讨论】:
-
你应该覆盖
draw(in context: CGContext)而不是drawInContext(ctx: CGContext)。 -
(嗯,这不是@clemens - 我确实测试了
draw#in- 我只是出于习惯打了旧的...... :)) -
您的问题有进展吗?如果
startPoint和endPoint始终与spinLike相关,则可以删除这些属性并在draw(in:)中计算它们的值。
标签: ios animation core-animation cabasicanimation cagradientlayer