Как я могу наблюдать за изменениями непрозрачности UIView (возможно, через его свойство CALayer?) - PullRequest
1 голос
/ 14 июля 2020

Заголовок - это основной c вопрос. Попытка получить уведомление при изменении непрозрачности на слое представления.

Это разрешено ...

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

Но это не компилируется ...

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

Есть идеи?

1 Ответ

0 голосов
/ 14 июля 2020

Из документации :

Имя свойства должно быть ссылкой на свойство, доступное в среде выполнения 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, следует уточнять имя свойства с помощью включающего его имени класса. В этом есть смысл, потому что как еще компилятор узнает , какое свойство isHidden вы имеете в виду?

#keyPath(isHidden) просто так работает , потому что класс в котором вы это пишете, также имеет свойство a isHidden (вероятно, подкласс UIView?).

Вы должны сделать:

#keyPath(CALayer.opacity)

для opacity

...