使用哪个?Delegate vs. keyPathObserver语言 - UIViewController With Tw



在我深入实现这一点之前,我想知道在UIScrollView被移动时实现与contentOffest有关的事情的最佳方法是什么。

注意:从阅读到有多个对象调用委托方法可能会有问题的情况下询问这个问题

1( 将观察者添加到每个视图的内容偏移键路径

2(使我的类成为UIScrollViewDelegate并使用scrollViewDidScroll。

class MyAwesomeVC: UIViewController, UIScrollViewDelegate {
@IBOutlet weak var scrollViewA: UIScrollView!
@IBOutlet weak var scrollViewB: UIScrollView!
private var observerContext = 0
...
override func viewDidLoad() {
super.viewDidLoad()
scrollViewA.delegate = self
scrollViewB.delegate = self
scrollViewA.addObserver(self, forKeyPath: "contentOffset", options: .new, context: &observerContext)
scrollViewB.addObserver(self, forKeyPath: "contentOffset", options: .new, context: &observerContext)
}
override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
// check which scrollview if possible then do all the things
}

func scrollViewDidScroll(_ scrollView: UIScrollView) {
// check which scrollview if possible then do all the things
}
...
deinit {
scrollViewA.removeObserver(self, forKeyPath: "contentOffset", context: &observerContext)
scrollViewB.removeObserver(self, forKeyPath: "contentOffset", context: &observerContext)
scrollViewA = nil
scrollViewB = nil
}

}

我想说最干净的方法是将自己分配为滚动视图委托并覆盖scrollViewDidScroll函数,就像您一样,并在函数中print(scrollView.contentOffset),并用它做任何你需要的事情。如果需要检查是否向下滚动,可以将保存上次 contentOffset 的属性附加到类中,并将其与当前属性进行比较。

最新更新