在动画期间尝试修改动画属性?

问题描述 投票:11回答:1

对于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函数中做到 - 怎么做?

ios calayer caanimation
1个回答
6
投票

当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

© www.soinside.com 2019 - 2024. All rights reserved.