我正在尝试使用#keyPath语法来获取CALayer属性来为它设置动画:
let myAnimation = CABasicAnimation.init(keyPath: #keyPath(CALayer.position.x))
我收到以下错误:
类型'CGPoint'没有成员'x'
我错过了什么?
答案 0 :(得分:3)
#keyPath
指令期望Objective-C属性序列为
论点。 CALayer
继承自NSObject
,但其position
属性是struct CGPoint
,它根本不是一个类,不能
与Key-Value编码一起使用。
但是, CALayer
有value(forKeyPath:)
的特殊实现
它处理整个密钥路径,而不是评估第一个密钥并传递剩余的密钥路径,比较https://github.com/Azure/azure-documentdb-dotnet/issues/227。
所以键值编码可以与“position.x”一起使用,但是 编译器不了解这种特殊处理方法。 例如,这一切都编译并运行:
let layer = CALayer()
layer.position = CGPoint(x: 4, y: 5)
print(layer.value(forKeyPath: "position")) // Optional(NSPoint: {4, 5}
print(layer.value(forKeyPath: "position.x")) // Optional(4)
print(layer.value(forKeyPath: #keyPath(CALayer.position))) // Optional(NSPoint: {4, 5})
但这不会编译:
print(layer.value(forKeyPath: #keyPath(CALayer.position.x)))
// error: Type 'CGPoint' has no member 'x'
这就是
的原因let myAnimation = CABasicAnimation(keyPath: #keyPath(CALayer.position.x))
无法编译,但这样做(KVC strange behavior):
let myAnimation = CABasicAnimation(keyPath: "position.x")
答案 1 :(得分:1)
position
是类型为CALayer
的对象中的属性,您希望从基类访问它,第二个keyPath将属性设置为在图层中设置动画,而CALayer.position.x
不是属性在你要设置动画的CALayer对象中,所以你必须position.x
不能直接写字而没有字符串""因为你会有错误说不能在你想要宣布它的班级中找到位置,所以正确的方法就是这样
let myLayer = CALayer.init()
myLayer.frame = CGRect(x: 0, y: 0, width: 20, height: 20)
let anim = CABasicAnimation.init(keyPath: "position.x")
anim.fromValue = 20
anim.toValue = 100
anim.duration = 1
myLayer.add(myAnimation, forKey: "position.x")
self.view.layer.addSublayer(myLayer)