当为 CALayer
上的特定属性设置动画时,我很困惑为什么 keyPath
是一个字符串。使用枚举不是更好更安全吗?只是想知道输入字符串文字的优势。
示例:let flash = CASSpringAnimation(keyPath: "borderColor")
最佳答案
虽然 Josh Homann 的回答非常有帮助,但同样值得注意的是,在这种情况下没有可以工作的特定枚举。 CASpringAnimation
可以应用于任何属性,而不仅仅是内置属性。甚至“内置”也是一种误导,因为有许多内置的 CALayer 子类,它们本身具有不同的属性。动画甚至不必应用于层(SceneKit 也使用它们)。如果您将自定义属性添加到图层,并希望使用 Spring 动画对其进行动画处理,那么如果这是一个枚举,那将是不可能的。
也就是说,你可以做得比在这里传递一个字符串(甚至是一个字符串常量)更好。您可以使用 #keyPath
:
let flash = CASpringAnimation(keyPath: #keyPath(CALayer.borderColor))
这提供了编译时检查是否确实定义了此方法。这实现了您使用枚举寻找的大部分目标,同时足够灵活以处理任何目标和属性。
在未来,希望 Core Animation 能够接受新的 Swift 4“KeyPath”类型,您将能够做到这一点:
let flash = CASpringAnimation(keyPath: \CALayer.borderColor)
关于ios - 为什么核心动画类型采用字符串键路径?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47533173/