8

最初のタッチから指を離すと、次のタッチが正常に認識されます。それは、最初のタッチを押し続けてから、同時に別の指で別の領域にタッチしようとしたときだけです。次に、その2番目のタッチが最初のタッチからのものとして誤って登録されます。

更新これは、最後のタッチが終了するまで呼び出されないtouchesEndedと関係があります(最後のタッチを最後に手放す前に、他に5つのタッチが終了しているかどうかは関係ありません...すべてを呼び出して終了します)最後のタッチが終了したら)

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {

 UITouch* touch = [touches anyObject];

 NSString* filename = [listOfStuff objectAtIndex:[touch view].tag];

// do something with the filename now

}

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {

 ITouch* touch = [touches anyObject];
 NSString* buttonPressed = [listOfStuff objectAtIndex:[touch view].tag];

 // do something with this info now
}
4

7 に答える 7

10

私は今日これを持っていました(というか、今日私はこの問題を私に投げかけました!)。

私が起こっているのを見た:

  • 指1のタッチスクリーン
  • touchesBegin fires
  • 指2のタッチスクリーン
  • touchesBegin fires
  • 指2を離します
  • 何も起こりません
  • 指1を離します
  • touchesEnded fires
  • touchesEnded fires

Gavin Cliftonが言ったように、ジェスチャーレコグナイザーを追加した場合にのみ発生します。レコグナイザーが追加されていない場合、touchsEndedは各指を離した後に発火します。レコグナイザーを使用する必要がなければ、これは素晴らしいことです... !!!

私はgestureRotation.delaysTouchesEnded=FALSEを追加することでこれを解決しました。レコグナイザーの作成/コードの追加:

gestureRotation = [[UIRotationGestureRecognizer alloc] initWithTarget:self action:@selector(gestureRotation_Callback:)];

[gestureRotation setDelegate:self];
gestureRotation.cancelsTouchesInView = FALSE;
gestureRotation.delaysTouchesEnded = FALSE;        // <---- this line!!
[self.view addGestureRecognizer: gestureRotation];
[gestureRotation release];

これでジェスチャーが機能し、touchsBeginがキューに入れなくなりました。

于 2012-07-13T10:01:36.433 に答える
7

何らかの理由で、touchesEndedは、タッチがスクロールビュー内にある場合にのみ遅延されます。次のいずれかの場合a)scrollviewのスクロールを無効にします。またはb)スクロールビューを使用しないでください。そうすると、touchesEndedがすぐに配信されます。

sendEventを傍受した人がいると聞きましたが、それは私には大雑把に思えます。sendEventは非常に多くのイベントを処理するため、レスポンダーチェーンを台無しにしたくありません。

追加の考えはありますか?誰かがUIWindowをサブクラス化して、その方法でタッチをインターセプトしようとしたことがありますか?あなたが提供できるどんな入力でもありがたいです。

于 2010-05-04T02:35:35.340 に答える
6

scrollviewには、デフォルトdelaysContentTouchesで設定されているプロパティがありYESます。スクロールジェスチャを決定するまで、すべてのタッチイベントを遅らせます。

于 2011-10-09T22:54:56.363 に答える
4

私はこの質問が少し古いことを知っていますが、私がちょうど持っているように、答えを探してこのスレッドに出くわした人のために私の経験を共有したいと思いました。

私はこの問題に数時間苦労してきましたが、私が思いついた唯一の解決策は、使用していたUIGestureRecognizerオブジェクトを削除することでした。

私のセットアップでは、パンおよびタップレコグナイザーを使用してこれらのジェスチャをキャプチャし、標準のタッチイベントにはtouchesBeganおよびtouchesEndedを使用していました。2番目のタッチエンディングのためにtouchesEndedメソッドが再び呼び出され始めたのは、UIGestureRecognizerオブジェクトを削除するまではありませんでした。具体的には、問題を引き起こしていたのはパンレコグナイザーでした。

これがこの場合に当てはまるかどうかは完全にはわかりませんが、私が抱えていた問題は解決しました。

于 2012-06-21T19:34:49.880 に答える
0

セットmultipleTouchEnabled

Interface Builderでは、「UserInteractionEnabled」の下の「MultipleTouch」チェックボックスです。

于 2010-04-28T02:57:02.017 に答える
0

touchesEndedScrollView内のボタンでが呼び出されることは決してないというこの問題が発生しました。Ovidiuの回答に基づいて、ScrollViewのContentOffsetを手動で設定すると問題が発生することがわかりました。おそらく、contentOffsetを私が持っていた方法で設定すると、ボタンを押しようとしたのか、ビューをスクロールしようとしたのかについて、ScrollViewが混乱していました。

オフセットをそのままにしておくと0,0、問題は解決しました。

于 2015-07-24T23:59:55.990 に答える
0

別のオプションを見つけました。

後、touchesBeganと呼ばれるCGPointに従って動かされません。touchesMovedtouchesCancelled

ただし、CGPointに従って変更された場合はtouchesMovedtouchesEndedと呼ばれます。

于 2018-02-12T06:12:07.563 に答える