編集:以下の私の解決策は最初に頭に浮かんだことでしたが、かなりハックであることが判明し、Apple がUIScrollView
クラスの内部を変更することを決定した場合に使用するのは安全ではない可能性があります。Mazyod によって提案された、より安全で簡単な回答を参照してください。
これは実装に依存し、将来の iOS アップデートで Apple によって変更される可能性がありますが、現在、UIScrollView
クラスはユーザーの操作を管理するためにジェスチャ認識エンジンに依存しているようUITableView
で、スクロール ビュー クラスのサブクラスであることは同じことを行います。
UIKit フレームワークの UIScrollView.h に移動すると_pan
、型を持っているid
が実際にはUIPanGestureRecognizer
.
だから私はこれを試してみましたが、うまくいくようです。
[_tableView addObserver: self
forKeyPath: @"pan.state"
options: NSKeyValueObservingOptionNew
context: nil];
テーブル ビューをドラッグするstate
と、ジェスチャ レコグナイザーが数回変化し、ドラッグを停止するとstate
、最後の変化を の値に受け取りますUIGestureRecognizerStateEnded
。
これでうまくいくように見えますが、他の問題が邪魔になる可能性があることに注意してください。その後、元の実装にアクセスできなくなるため、通常、カテゴリ内の既存のクラス メソッドをオーバーライドすることはお勧めできません。NSKeyValueObserving
非公式議定書に関する文書には、次のように記載されています。
NSObject は、すべてのオブジェクトに自動監視機能を提供する NSKeyValueObserving プロトコルの実装を提供します。
そのため、カテゴリでオーバーライドobserveValueForKeyPath:ofObject:change:context:
すると、デフォルトの実装にアクセスできなくなります (そして、何かに KVO を使用していないかどうかはわかりません) UITableView
。UIScrollView
これにより、予期しないエラーが発生する可能性があります。