对于CALayer
,
这是动画,
class Test: CAGradientLayer {
override func draw(in ctx: CGContext) {
super.draw(in: ctx)
startPoint = ....
}
***由于未捕获的异常'CALayerReadOnly'而终止应用程序,原因是:'尝试修改只读层
在draw#inContext
调用中,似乎无法更改普通的可动画属性之一。
例如:
拥有自己的动画自定义属性简单易行,然后根据它绘制一些东西。这是.progress
属性的一些代码,
https://stackoverflow.com/a/37470079/294884
在动画你的.progress
属性的同时,很容易想象想要设置图层的其他属性,使用一些基于每帧.progress
值的公式。
但是,你不能在draw#in
函数中做到 - 怎么做?
当CoreAnimation执行动画时,它会创建图层的阴影副本,并且每个副本将在不同的帧中呈现。副本由-initWithLayer:
创建。此方法创建的副本是只读的。这就是为什么你正在寻找异常的原因。
您可以覆盖此方法以创建所需属性的自己的副本。例如:
override init(layer: Any) {
super.init(layer: layer)
// Check class
if let myLayer = layer as? CircleProgressLayer {
// Copy the value
startPoint = myLayer.startPoint
}
}
您应该编写self.startPoint
而不是设置self.modelLayer.startPoint = ...
,因为所有演示文稿副本共享相同的模型。
请注意,在读取变量时也必须执行此操作,而不仅仅是在设置变量时。为了完整性,还应该提及属性表示,而是返回正在显示的层的当前(副本)。
提到qazxsw poi