これを実行するまでには、UIScrollViewの移動に伴ってcontentOffestに関して何かを実行する最適な方法を知りたいと思っていました。どちらを使用しますか?デリゲート対keyPathObserver - 2つのUIScrollViewsを持つUIViewController
注:ビューcontentOffsetキーパス
2のそれぞれにオブザーバーを追加する)デリゲートメソッドを呼び出して複数のオブジェクトを持つことが
1問題となる可能性があることを読んだからこれを頼む)私のクラスaを作ります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
私は途中で残りのコードを必要とせずにこれを探していました。また、scrollPathDidScrollのようなデリゲートメソッドが既にkeyPathObserversからトリガーされていますか? 私はそれを見ているときに、それを呼び出す複数のオブジェクトを持つデリゲートメソッドを使用すると乱雑になる可能性があるという主張があったからです。 – solenoid
デリゲートとKVOはお互いに関係ありません。しかし、ここで両方を実装することに意味はありません。あなたのニーズに応じてデリゲートメソッドが存在するので、KVOを使用するのは無意味です。デリゲートメソッドの内部では、 'scrollView'パラメータを2つのコンセントプロパティと単純に比較して、どのスクロールビューがスクロールされたかを知ることができます。非常に簡単です。 – rmaddy