在 CABasicAnimation 中使用 #keyPath 时,类型 'CGPoint' 没有成员 'x'
Type 'CGPoint' has no member 'x' when using #keyPath in CABasicAnimation
我正在尝试使用 #keyPath 语法来获取 CALayer 属性 来为其设置动画:
let myAnimation = CABasicAnimation.init(keyPath: #keyPath(CALayer.position.x))
我收到以下错误:
Type 'CGPoint' has no member 'x'
我错过了什么?
position
是类型 CALayer
对象中的 属性 并且您想从基础 class 访问它,第二个 keyPath 需要一个 属性 到在图层中设置动画并且 CALayer.position.x
不是要设置动画的 CALayer 对象内的 属性,因此它必须是 position.x
,您不能在没有字符串 "" 的情况下直接编写有错误说无法在 class 中找到您要声明的位置,所以正确的方法应该是这样
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)
#keyPath
指令需要一个 Objective-C 属性 序列作为
争论。 CALayer
继承自 NSObject
,但其 position
属性 是 struct CGPoint
,根本不是 class,也不能
与 Key-Value 编码一起使用。
但是CALayer
有一个特殊的实现value(forKeyPath:)
它处理整个键路径,而不是评估第一个键并传递剩余的键路径,比较 KVC strange behavior.
所以Key-Value编码可以与"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))
不编译,但是编译 ():
let myAnimation = CABasicAnimation(keyPath: "position.x")
我正在尝试使用 #keyPath 语法来获取 CALayer 属性 来为其设置动画:
let myAnimation = CABasicAnimation.init(keyPath: #keyPath(CALayer.position.x))
我收到以下错误:
Type 'CGPoint' has no member 'x'
我错过了什么?
position
是类型 CALayer
对象中的 属性 并且您想从基础 class 访问它,第二个 keyPath 需要一个 属性 到在图层中设置动画并且 CALayer.position.x
不是要设置动画的 CALayer 对象内的 属性,因此它必须是 position.x
,您不能在没有字符串 "" 的情况下直接编写有错误说无法在 class 中找到您要声明的位置,所以正确的方法应该是这样
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)
#keyPath
指令需要一个 Objective-C 属性 序列作为
争论。 CALayer
继承自 NSObject
,但其 position
属性 是 struct CGPoint
,根本不是 class,也不能
与 Key-Value 编码一起使用。
但是CALayer
有一个特殊的实现value(forKeyPath:)
它处理整个键路径,而不是评估第一个键并传递剩余的键路径,比较 KVC strange behavior.
所以Key-Value编码可以与"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))
不编译,但是编译 (
let myAnimation = CABasicAnimation(keyPath: "position.x")