3

私の問題は非常に奇妙ですが単純です。私は顧客の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:で現在の位置を検出して、それがインバウンドであるかどうかを確認するように提案する場合があります。これは、動きが非常に遅い場合に機能する可能性がありますが、非常に速く移動すると、システムはすべてのポイント位置を検出できず、特定の時間間隔で動きが検出されたように見えます。ユーザーの指が範囲外に移動したかどうかを検出するにはどうすればよいですか?

4

2 に答える 2

3

touchesCancelled:withEvent:メソッドが呼び出されると思います!

于 2012-07-23T08:22:42.023 に答える
1

私はこの問題を解決しました。bcsUIScrollViewはあまりにも多くの作業を実行するため、一部のイベントを自分で処理できません。幸い、UIViewはタッチの範囲外の移動を検出し、touchesEnd:withEvent:メソッドを呼び出します。MyScrollViewのスーパークラスをUIViewに置き換えるには作業が多すぎることを考慮して、解決する簡単な方法を考え出しました。UIViewからサブクラス化されたTouchActionDetectViewを追加しました。このサブクラスの作業は、すべてのユーザータッチイベントを検出し、それらのイベントをMyScrollViewに配信することです。もちろん、他のビューコンテンツをブロックしないように、TouchActionDetectViewの背景色をクリアする必要があります。

于 2012-07-24T17:29:14.030 に答える