私は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:
も同じロジックで実装されています
誰かがこの振る舞いを説明できますか?足りないものはありますか?
recognizer.cancelsTouchesInView = false
をSwift)に設定するか、recognizer.cancelsTouchesInView = NO;
をObjective-Cに設定する必要があります
そのビューにあるジェスチャ認識機能を削除してみてください。それらはtouchesEnded
に干渉する可能性があります。
Superの実装を呼び出さない場合は、すべてのtouchメソッドをオーバーライドする必要があります。したがって、touchesMoved:withEvent:
メソッドとtouchesCancelled:withEvent:
メソッドも実装する必要があります。実装は空にすることができますが、それを行う必要があります。
touchesBegan:withEvent:
Super(一般的な使用パターン)を呼び出さずにこのメソッドをオーバーライドする場合、スタブ(空の)実装としてのみである場合は、タッチイベントを処理するための他のメソッドもオーバーライドする必要があります。
に基づく IResponderクラスリファレンス
UIView
のhitTest
メソッドをオーバーライドしてみてください。
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
return self;
}
指を離すと、指がUIView
にあると認識されないため、touchesEnded
が呼び出されない可能性があります。
内部情報:
私は使っている:
- 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];
私は同じ問題を抱えていて、この簡単なコードで解決しました。
NSInteger touchCount = 0;
for (UITouch *touch in touches) {
touchCount++;
if([[event allTouches]count] == touchCount){
// do what you have to do here
}
}
//ここで警告が表示されますが、気にしないでください
この助けを願っています!
4つのタッチハンドラーをすべて定義した後でも、同じ問題が発生しました。また、アクティブな認識機能もありませんでした。
私にとっての解決策は、ビューでマルチタッチイベントを有効にすることでした。
self.multipleTouchEnabled = YES;
これは魔法のように問題を解決しました。
これ以前にも「マルチタッチ」イベント、つまり複数の指のイベントが同時に発生していましたが、すべてが正しく終了しなかったという上記の問題がありました。
それが誰かを助けることを願っています! :)