对 CAAction 的 运行 方法感到困惑

Confused about the CAAction's run method

我正在尝试了解这种方法 run(forKey:object:arguments:) is operating exactly in the following code from Apple's documentation:

let delegate = LayerDelegate()
     
lazy var sublayer: CALayer = {
    let layer = CALayer()
    layer.delegate = self.delegate
    
    return layer
}()
     
func moveSublayer() {
    guard let action = sublayer.action(forKey: "moveRight") else {
        return
    }
    
    action.run(forKey: "transform", object: sublayer, arguments: nil) // this line
}
     
class LayerDelegate: NSObject, CALayerDelegate {
    func action(for layer: CALayer, forKey event: String) -> CAAction? {
        
        guard event == "moveRight" else {
            return nil
        }
        
        let animation = CABasicAnimation()
        animation.valueFunction = CAValueFunction(name: CAValueFunctionName.translateX)
        animation.fromValue = 1
        animation.toValue = 300
        animation.duration = 2
        
        return animation
    }
}

我对 action.run(forKey: "transform", object: sublayer, arguments: nil) 中的 forKey 参数特别困惑。

在文档中,它表示为:

The identifier of the action. The identifier may be a key or key path relative to anObject, an arbitrary external action, or one of the action identifiers defined in CALayer.

我知道渲染树中的动画列表就像一个字典,所以你用一个键查询列表,你会得到一个特定的动画作为一个值,这就是上面例子中发生的事情。子层用"moveRight"查询动画列表:

guard let action = sublayer.action(forKey: "moveRight") else {
    return
}

然后使用以下方法返回操作:

func action(for layer: CALayer, forKey event: String) -> CAAction? {
    guard event == "moveRight" else {
        return nil
    }
    
    let animation = CABasicAnimation()
    animation.valueFunction = CAValueFunction(name: kCAValueFunctionTranslateX)
    animation.fromValue = 1
    animation.toValue = 300
    animation.duration = 2
    
    return animation
}

但是,这个 forKey: "transform" 是做什么用的?我们已经使用“moveRight”键查询了动画列表并获得了值。为什么我们需要另一把钥匙?

此外,如果我要创建一个结合变换和不透明度或其他非变换的组动画怎么办属性?我必须使用什么来代替 forKey: "transform"?

所有 CALayer 属性都可以通过键值编码的字符串名称访问。这个事实是隐式层动画和整个 CAAction 机制的基础。

好吧,好吧,没有moveRight属性。 "moveRight" 只是我们编造的名字。你必须问问自己我们如何向右移动。

在这个例子中,我们将通过动画层的 transform 来实现,特别是使用 X 分量从 1 到 300 的平移变换(如您在 action(forLayer) 实施)。因此我们必须使用 "transform" 键,因为我们要为 transform 属性.

设置动画