如何观察 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)
有什么想法吗?
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
题目是基础题。尝试在视图(s 层)上的不透明度发生变化时收到通知。
这是允许的...
addedView.addObserver(self, forKeyPath: #keyPath(isHidden), options: [.old, .new], context: nil)
但这不能编译...
addedView.layer.addObserver(self, forKeyPath: #keyPath(opacity), options: [.old, .new], context: nil)
有什么想法吗?
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