私の問題は非常に奇妙ですが単純です。私は顧客のUIScrollViewをサブクラス化しました:MyScrollView、ここで私はスクロールを無効にしました:
self.scrollEnabled = NO;
それは別のことを意味します
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
他のすべてのUIScrollViewDelegateメソッドは呼び出されず、MyScrollViewでは、画面上のユーザーのタッチの動きを検出することでコンテンツスクロールを実行します。つまり、フリップやバウンスは発生しません。実装はtouchesMoved:withEvent:メソッドにあります。
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
UITouch *touch = [touches anyObject];
// NSLog(@"touch.phase:%d",touch.phase);
CGPoint currentPosition = [touch locationInView:self];
CGPoint lastTouchPosition = [touch previousLocationInView:self];
CGFloat deltaY = lastTouchPosition.y - currentPosition.y;
CGFloat contentYOffset = self.contentOffset.y + deltaY;
[self setContentOffset:CGPointMake(0,contentYOffset) animated:NO];
}
ユーザーのドラッグ移動が終了した後、touchesEnded:withEvent:のMyScrollViewのコンテンツオフセットに従って独自のメソッドを実行します。
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
//some implementation according to current content offset
}
ユーザーが画面上で指を動かすと、指が画面の表面を離れるたびに、touchesEnded:withEvent:が呼び出され、自分のメソッドを正しく実装できます。
ただし、ユーザーが画面の表面で指を画面の内側から外側に上または下に移動してから指を上に持ち上げると、touchesEnded:withEvent:メソッドが呼び出されないため、iOSは移動の範囲を処理しないようです。 (上または下)タッチ終了イベントとしてのイベント、またiosは、タッチが画面の境界の外にあるときに何が起こっているのかを知りません
誰かがtouchesMoved:withEvent:で現在の位置を検出して、それがインバウンドであるかどうかを確認するように提案する場合があります。これは、動きが非常に遅い場合に機能する可能性がありますが、非常に速く移動すると、システムはすべてのポイント位置を検出できず、特定の時間間隔で動きが検出されたように見えます。ユーザーの指が範囲外に移動したかどうかを検出するにはどうすればよいですか?