0
在我實現它之前,我想知道在UIScrollView移動時如何實現關於contentOffest的處理的最佳方式。要使用哪些? Delegate與keyPathObserver - 具有兩個UIScrollView的UIViewController
注:從已經讀取問這認爲具有一個以上的對象調用委託方法可能是有問題
1)添加觀察員到每個視圖contentOffset keyPaths
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
}
}
這是一個基於某種意見的問題(因此它可能會被關閉),但選項2更簡單,所需代碼更少。 – rmaddy
我在查看這段代碼時沒有看到其他代碼,並且有一種輔助問題 - 像keyViewObservers已經觸發了像scrollViewDidScroll這樣的委託方法嗎? 我只問,因爲當查看它時,有人聲稱使用委託方法與多個對象調用它可能會變得混亂。 – solenoid
代表和KVO沒有任何關係。但是在這裏實施這兩者並沒有意義。由於您的需求存在委託方法,因此使用KVO毫無意義。在委託方法內部,您可以簡單地比較'scrollView'參數和兩個出口屬性,以瞭解哪個滾動視圖已經滾動。很簡單。 – rmaddy