Fat*_*tie 3 key-value-observing uiview swift3
对于KVO来说,在Swift3中使用这个伟大的帖子中的技术"很容易"...
我怎么KVO UIView的alpha?
目标:想象一个小视图的屏幕V.屏幕有一个大的桌面视图.每个单元格都有一个小视图CV.
我希望每个CV跟随1 V的α,实际上在五的Alpha的动画
(我能想到的唯一真正的替代品是CADisplayLink细胞并轮询V的alpha,这种情况很糟糕.)
1原因是什么?这是跨单元格同步alpha变化的唯一方法.
注意正如Rob在下面解释的那样,实际上图层的alpha不具有动画效果.(它只是在动画开始时"立即"设置为新值.)实际上,您必须遵循表示层.这是一个逆向过程的例子,从你想要的每一次抽奖中拉出来
let d = CADisplayLink(target: self, selector: #selector(ThisClassName.updateAlpha))
d.add(to: RunLoop.current, forMode: RunLoopMode.commonModes)
func updateAlpha() {
let a = leader.layer.presentation()?.value(forKey: "opacity") as! CGFloat
follower.alpha = a
}
Run Code Online (Sandbox Code Playgroud)
Rob*_*Rob 10
这不是KVO的理想用例.您可能更愿意转到正在更改的代码,alpha并让它对其他视图进行必要的更新(或者构建一些接口以更一般地执行此操作;除了KVO之外的其他内容).
另请注意,如果您正在处理动画,则KVO alpha 可能仅识别动画的启动,而不是观察动画期间飞行中的变化.(变化的那些种类通常与所捕获的presentation/ presentationLayer在一个CADisplayLink或类似物.)
说完了,是的,你可以观察alpha财产.所以,在Swift 3中,只需定义上下文:
private var observerContext = 0
Run Code Online (Sandbox Code Playgroud)
然后添加观察者:
observedView.addObserver(self, forKeyPath: "alpha", options: .new, context: &observerContext)
Run Code Online (Sandbox Code Playgroud)
然后实现你的观察者:
override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
guard context == &observerContext else {
super.observeValue(forKeyPath: keyPath, of: object, change: change, context: context)
return
}
// do what you want here
}
Run Code Online (Sandbox Code Playgroud)
请注意,请记住删除观察者.例如,您可以在deinit以下位置执行此操作:
deinit {
observedView.removeObserver(self, forKeyPath: "alpha", context: &observerContext)
}
Run Code Online (Sandbox Code Playgroud)
注意,在Swift 4中,这个过程有点简化.定义一个token属性以跟踪您的观察者:
private var token: NSKeyValueObservation?
Run Code Online (Sandbox Code Playgroud)
然后观察alpha物业:
token = observedView.observe(\.alpha) { [weak self] object, change in
// do something
}
Run Code Online (Sandbox Code Playgroud)
注意使用[weak self]确保闭合不会引起强烈的参考循环.显然,如果你没有引用self那个闭包,那就不需要了.
但是基于块的模式的优点是(a)当token超出范围时,观察者被自动移除,因此不需要特殊的deinit例程; (b)可观察的密钥observedView现在是强类型的,避免了密钥中的简单印刷错误; (c)因为观察者与这种封闭有关,我们不再需要对观察者的背景进行检查,并且self如果这不是我们的背景,则会打电话.
| 归档时间: |
|
| 查看次数: |
1400 次 |
| 最近记录: |