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

How can I observe changes to opacity of a UIView (possibly via its CALayer property?)

题目是基础题。尝试在视图(s 层)上的不透明度发生变化时收到通知。

这是允许的...

addedView.addObserver(self, forKeyPath: #keyPath(isHidden), options: [.old, .new], context: nil)

但这不能编译...

addedView.layer.addObserver(self, forKeyPath: #keyPath(opacity), options: [.old, .new], context: nil)

有什么想法吗?

来自documentation

The property name must be a reference to a property that is available in the Objective-C runtime. [...] For example:

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

if let value = c.value(forKey: keyPath) {
    print(value)
}

When you use a key-path string expression within a class, you can refer to a property of that class by writing just the property name, without the class name.

extension SomeClass {
    func getSomeKeyPath() -> String {
        return #keyPath(someProperty)
    }
}
print(keyPath == c.getSomeKeyPath())
// Prints "true"

所以说真的,#keyPath(...) 中的 属性 名字一般来说应该是合格的 。除非 属性 与 #keyPath 表达式在同一个 class 中,否则您应该使用封闭的 class 名称来限定 属性 名称。这是有道理的,因为编译器还怎么知道 which isHidden 属性 你的意思?

#keyPath(isHidden) 恰好有效 因为你正在写这篇文章的 class 也 恰好有 一个isHidden属性(可能是一个UIView子class?)。

你应该这样做:

#keyPath(CALayer.opacity)

对于opacity