2017-07-06 29 views
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 
    } 


} 
+0

這是一個基於某種意見的問題(因此它可能會被關閉),但選項2更簡單,所需代碼更少。 – rmaddy

+0

我在查看這段代碼時沒有看到其他代碼,並且有一種輔助問題 - 像keyViewObservers已經觸發了像scrollViewDidScroll這樣的委託方法嗎? 我只問,因爲當查看它時,有人聲稱使用委託方法與多個對象調用它可能會變得混亂。 – solenoid

+0

代表和KVO沒有任何關係。但是在這裏實施這兩者並沒有意義。由於您的需求存在委託方法,因此使用KVO毫無意義。在委託方法內部,您可以簡單地比較'scrollView'參數和兩個出口屬性,以瞭解哪個滾動視圖已經滾動。很簡單。 – rmaddy

回答

0

我會說這樣做是隻爲自己分配爲滾動視圖代表和覆蓋功能scrollViewDidScroll像你有最清晰的方式,和print(scrollView.contentOffset)在功能,並做任何你需要它。如果您需要檢查是否向下滾動,您可以將一個屬性添加到您的課程中,以保存最後一個contentOffset,並將其與當前的內容進行比較。