gpt4 book ai didi

uiview - 在 Swift3 中,KVO 是 UIView 的 alpha 吗?

转载 作者:行者123 更新时间:2023-12-01 08:24:19 25 4
gpt4 key购买 nike

在 Swift3 中使用 KVO 值“很容易”,使用这篇很棒的文章中的技术......

https://stackoverflow.com/a/25219216/294884

我如何对 UIView 的 alpha 进行 KVO?

目标:想象一个带有小 View V 的屏幕。屏幕有一个大表 View 。每个单元格都有一个小 View CV。

我希望每个 CV 都跟随 1 V 的 alpha,实际上是在 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
}

最佳答案

这不是 KVO 的理想用例。您可能更喜欢查看更改 alpha 的代码。并让它对其他 View 进行必要的更新(或构建一些界面来更通用地执行此操作;除 KVO 之外的其他内容)。

另请注意,如果您正在处理动画,alpha 的 KVO |可能只识别动画的开始,而不观察动画过程中飞行中的变化。 (这些类型的更改通常使用 presentation/presentationLayer 中的 CADisplayLink 等来捕获。)

话虽如此,是的,您可以观察alpha属性(property)。因此,在 Swift 3 中,只需定义上下文:

private var observerContext = 0  

然后添加观察者:
observedView.addObserver(self, forKeyPath: "alpha", options: .new, context: &observerContext)

然后实现你的观察者:
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
}

注意,记得移除观察者。例如,您可以在 deinit 中执行此操作。 :
deinit {
observedView.removeObserver(self, forKeyPath: "alpha", context: &observerContext)
}

注意,在 Swift 4 中,这个过程被简化了一点。定义一个 token跟踪观察者的属性:
private var token: NSKeyValueObservation?

然后观察 alpha属性(property):
token = observedView.observe(\.alpha) { [weak self] object, change in
// do something
}

注意使用 [weak self]以确保关闭不会导致强引用循环。显然,如果您没有引用 self在那个关闭中,这是不需要的。

但是基于块的模式的优点在于 (a) 当 token超出范围,观察者被自动移除,所以没有特殊 deinit需要例行公事; (b) observedView 的可观察键现在是强类型的,避免键中的简单打印错误; (c) 因为观察者链接到这个闭包,我们不再需要检查观察者的上下文并调用 self如果这不是我们的背景。

关于uiview - 在 Swift3 中,KVO 是 UIView 的 alpha 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41351175/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com