微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

对 CAAction 的 run 方法感到困惑

如何解决对 CAAction 的 run 方法感到困惑

我正在尝试了解此方法 run(forKey:object:arguments:) 如何在 Apple 的 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
    }
}

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

在文档中,它是这样说的:

动作的标识符。标识符可以是键或键路径 相对于 anObject、任意外部动作或 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:“转换”?

解决方法

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

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

在本例中,我们将通过为图层的 transform 设置动画来实现,特别是使用具有从 1 到 300 的 X 分量的平移变换(如您在 action(forLayer)执行)。因此我们必须使用 "transform" 键,因为我们想要为 transform 属性设置动画。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。