web-dev-qa-db-ja.com

タッチが呼び出されないで終了しました

私はiOSアプリケーションのタッチを認識して遊んでいますが、この単純なコードがあります

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
 NSLog(@"%lu",(unsigned long)[touches count]);
 [touches enumerateObjectsUsingBlock:^(id obj, BOOL *stop) {
     UITouch *touch = obj;
     CGPoint touchLocation = [touch locationInNode:self.scene];
     NSLog(@"B x:%f - y:%f",touchLocation.x,touchLocation.y);
 }];
}

-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
 [touches enumerateObjectsUsingBlock:^(id obj, BOOL *stop) {
    UITouch *touch = obj;
    CGPoint touchLocation = [touch locationInNode:self.scene];
    NSLog(@"E x:%f - y:%f",touchLocation.x,touchLocation.y);
 }];
}

TouchesBeganは正常に呼び出されています。画面上に、1本の指から最大5本の指を同時に配置すると、正しい情報で呼び出されていることがわかります。

touchesBeganでも同じことは起こりません。画面上に3本の指があり、同時にそれらを削除すると、2回のタッチ(場合によっては1回)の情報しか表示されません。一度に1本ずつ指を離すと、メソッドも通常2回呼び出されます(1回呼び出されることもありますが、正しい3回呼び出されることはめったにありません)。 touchesEndedメソッドで表示

メソッドtouchesMoved:withEvent:およびtouchesCancelled:withEvent:も同じロジックで実装されています

誰かがこの振る舞いを説明できますか?足りないものはありますか?

16
sahmed24

recognizer.cancelsTouchesInView = falseをSwift)に設定するか、recognizer.cancelsTouchesInView = NO;をObjective-Cに設定する必要があります

28
Whakkee

そのビューにあるジェスチャ認識機能を削除してみてください。それらはtouchesEndedに干渉する可能性があります。

23
Bognar

Superの実装を呼び出さない場合は、すべてのtouchメソッドをオーバーライドする必要があります。したがって、touchesMoved:withEvent:メソッドとtouchesCancelled:withEvent:メソッドも実装する必要があります。実装は空にすることができますが、それを行う必要があります。

touchesBegan:withEvent:

Super(一般的な使用パターン)を呼び出さずにこのメソッドをオーバーライドする場合、スタブ(空の)実装としてのみである場合は、タッチイベントを処理するための他のメソッドもオーバーライドする必要があります。

に基づく IResponderクラスリファレンス

4
RaffAl

UIViewhitTestメソッドをオーバーライドしてみてください。

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
   return self;
}

指を離すと、指がUIViewにあると認識されないため、touchesEndedが呼び出されない可能性があります。

1
Hristo
  • タップジェスチャ(シンプル、ロング、2xショート、2xフィンガータップ)は、通話を許可しませんTouches Ended/Cancels if cancelsTouchesInView == NO
  • CancelsTouchesInViewプロパティがデフォルトのYESである場合にのみ、呼び出しを許可します
  • ピンチジェスチャは、cancelsTouchesInViewプロパティがNOに設定されている場合にのみ、すべての呼び出しを許可します(タッチの開始/移動/終了/キャンセル)
  • ピンチジェスチャの場合、cancelsTouchesInViewプロパティがYESの場合、touchesMovedは呼び出されませんでした。

内部情報:

私は使っている:

  • 1本の指UITapGestureRecognizer
  • 1本の指UILongPressGestureRecognizer
  • 1本の指でダブルタップUITapGestureRecognizer
  • 2本の指でUITapGestureRecognizerをタップします
  • 1 UIPinchGestureRecognizer

また、1本の指でパンする必要があります。しかし、私が見つけたのは、ユーザーが1本の指を上げても、ピンチジェスチャが終了していなかったことです。どういうわけか、iOSはまだ「変更された」状態でピンチのセレクターを呼び出しています。

私の解決策は、touchesBegin/Moved/Endedを使用してパンをキャッチし、ピンチセレクターが呼び出された場合の安全チェックとしてアクティブなタッチの数を使用することでした。

上記の構成を行う際に使用しなければならなかったその他の設定:

self.multipleTouchEnabled = YES;
[oneFingerTapRecognizer requireGestureRecognizerToFail:oneFingerLongPressRecognizer];
[oneFingerTapRecognizer requireGestureRecognizerToFail:oneFingerDoubleTapRecognizer];
[oneFingerLongPressRecognizer requireGestureRecognizerToFail:oneFingerDoubleTapRecognizer];
[twoFingersTapRecognizer requireGestureRecognizerToFail:twoFingersPinch];
1
Octav

私は同じ問題を抱えていて、この簡単なコードで解決しました。

NSInteger touchCount = 0;
for (UITouch *touch in touches) {
   touchCount++;
    if([[event allTouches]count] == touchCount){
       // do what you have to do here
    }
}

//ここで警告が表示されますが、気にしないでください

この助けを願っています!

0
Arthur

4つのタッチハンドラーをすべて定義した後でも、同じ問題が発生しました。また、アクティブな認識機能もありませんでした。

私にとっての解決策は、ビューでマルチタッチイベントを有効にすることでした。

self.multipleTouchEnabled = YES;

これは魔法のように問題を解決しました。

これ以前にも「マルチタッチ」イベント、つまり複数の指のイベントが同時に発生していましたが、すべてが正しく終了しなかったという上記の問題がありました。

それが誰かを助けることを願っています! :)

0