Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 如何观察UIView不透明度的变化(可能通过其CALayer属性?)_Swift_Uiview_Calayer_Key Value Observing - Fatal编程技术网

Swift 如何观察UIView不透明度的变化(可能通过其CALayer属性?)

Swift 如何观察UIView不透明度的变化(可能通过其CALayer属性?),swift,uiview,calayer,key-value-observing,Swift,Uiview,Calayer,Key Value Observing,标题是基本问题。试图在视图(s层)上的不透明度更改时获得通知 这是允许的 addedView.addObserver(self, forKeyPath: #keyPath(isHidden), options: [.old, .new], context: nil) 但这并没有编译 addedView.layer.addObserver(self, forKeyPath: #keyPath(opacity), options: [.old, .new], context: nil) 有什么想

标题是基本问题。试图在视图(s层)上的不透明度更改时获得通知

这是允许的

addedView.addObserver(self, forKeyPath: #keyPath(isHidden), options: [.old, .new], context: nil)
但这并没有编译

addedView.layer.addObserver(self, forKeyPath: #keyPath(opacity), options: [.old, .new], context: nil)
有什么想法吗?

来自:

属性名称必须是对可用属性的引用 在Objective-C运行时中。[……]例如:

// ...
let c = SomeClass(someProperty: 12)
let keyPath = #keyPath(SomeClass.someProperty)

if let value = c.value(forKey: keyPath) {
    print(value)
}
在类中使用键路径字符串表达式时,可以 通过只写属性名来引用该类的属性, 没有类名

extension SomeClass {
    func getSomeKeyPath() -> String {
        return #keyPath(someProperty)
    }
}
print(keyPath == c.getSomeKeyPath())
// Prints "true"
因此,实际上,
#keyPath(…)
中的属性名通常应该是限定的。除非属性与
#keyPath
表达式位于同一类中,否则应使用其封闭类名限定属性名称。这是有意义的,因为编译器如何知道您指的是哪个
ishiden
属性

#keyPath(ishiden)
恰好可以工作,因为您在其中编写此代码的类也碰巧有一个
ishiden
属性(可能是
UIView
子类?)

你应该做:

#keyPath(CALayer.opacity)
对于
不透明度

,来自:

属性名称必须是对可用属性的引用 在Objective-C运行时中。[……]例如:

// ...
let c = SomeClass(someProperty: 12)
let keyPath = #keyPath(SomeClass.someProperty)

if let value = c.value(forKey: keyPath) {
    print(value)
}
在类中使用键路径字符串表达式时,可以 通过只写属性名来引用该类的属性, 没有类名

extension SomeClass {
    func getSomeKeyPath() -> String {
        return #keyPath(someProperty)
    }
}
print(keyPath == c.getSomeKeyPath())
// Prints "true"
因此,实际上,
#keyPath(…)
中的属性名通常应该是限定的。除非属性与
#keyPath
表达式位于同一类中,否则应使用其封闭类名限定属性名称。这是有意义的,因为编译器如何知道您指的是哪个
ishiden
属性

#keyPath(ishiden)
恰好可以工作,因为您在其中编写此代码的类也碰巧有一个
ishiden
属性(可能是
UIView
子类?)

你应该做:

#keyPath(CALayer.opacity)

对于
opacity

您在哪里编写代码?您在哪里编写代码?完美!你回答了我的另一个问题。。。为什么,如果它只是一个字符串,那么它的定义在哪里重要吗?现在我知道了,其他人也会知道!谢谢完美的你回答了我的另一个问题。。。为什么,如果它只是一个字符串,那么它的定义在哪里重要吗?现在我知道了,其他人也会知道!谢谢