在CABasicAnimation中使用#keyPath时,类型'CGPoint'没有成员'x'

时间:2018-02-24 15:10:45

标签: ios swift calayer cabasicanimation

我正在尝试使用#keyPath语法来获取CALayer属性来为它设置动画:

let myAnimation = CABasicAnimation.init(keyPath: #keyPath(CALayer.position.x))

我收到以下错误:

  

类型'CGPoint'没有成员'x'

我错过了什么?

2 个答案:

答案 0 :(得分:3)

#keyPath指令期望Objective-C属性序列为 论点。 CALayer继承自NSObject,但其position 属性是struct CGPoint,它根本不是一个类,不能 与Key-Value编码一起使用。

但是, CALayervalue(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)