12

setCancelsTouchesInView を呼び出すと実際に何が起こるのだろうか。公式ドキュメントではカバーされていませんhttp://developer.apple.com/library/ios/#documentation/uikit/reference/UIGestureRecognizer_Class/Reference/Reference.html

ありがとう

4

2 に答える 2

35

ACB はUIGestureRecognizer参考文献を引用しました。もう少し具体的にするために、パン ジェスチャ レコグナイザがアタッチされたビューがあり、View Controller に次のメソッドがあるとします。

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    NSLog(@"touchesBegan");
}

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
    NSLog(@"touchesMoved");
}

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
    NSLog(@"touchesEnded");
}

- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event {
    NSLog(@"touchesCancelled");
}

- (IBAction)panGestureRecognizerDidUpdate:(UIPanGestureRecognizer *)sender {
    NSLog(@"panGesture");
}

もちろん、パン ジェスチャ レコグナイザはpanGestureRecognizerDidUpdate:メッセージを送信するように構成されています。

ここで、ビューに触れて、パン ジェスチャが認識されるまで指を動かし、指を離したとします。アプリは何を印刷しますか?

ジェスチャ レコグナイザーが にcancelsTouchesInView設定されている場合YESアプリは次のメッセージをログに記録します。

touchesBegan
touchesMoved
touchesCancelled
panGesture
panGesture
(etc.)

touchesMovedキャンセル前に複数いただく場合がございます。

したがって、(デフォルト) に設定cancelsTouchesInViewするYESと、システムはジェスチャ認識エンジンから最初のメッセージを送信する前にタッチをキャンセルし、そのタッチに関するタッチ関連のメッセージはそれ以上取得されません。

ジェスチャ レコグナイザーが にcancelsTouchesInView設定されている場合NOアプリは次のメッセージをログに記録します。

touchesBegan
touchesMoved
panGesture
touchesMoved
panGesture
touchesMoved
panGesture
(etc.)
panGesture
touchesEnded

したがって、 に設定cancelsTouchesInViewするNOと、システムはジェスチャ タッチのタッチ関連メッセージをジェスチャ レコグナイザーのメッセージと交互に送信し続けます。タッチはキャンセルされるのではなく、正常に終了します (タッチ中にホームボタンが押されたなど、他の理由でシステムがタッチをキャンセルしない限り)。

于 2012-10-24T03:50:20.900 に答える
2

Apple 開発者ポータルのリンクから:

cancelsTouchesInView — ジェスチャ レコグナイザーがそのジェスチャを認識した場合、そのジェスチャの残りのタッチをビューからバインド解除します (したがって、ウィンドウはそれらを配信しません)。ウィンドウは、以前に配信されたタッチを (touchesCancelled:withEvent:) メッセージでキャンセルします。ジェスチャ レコグナイザーがそのジェスチャを認識しない場合、ビューはマルチタッチ シーケンスのすべてのタッチを受け取ります。

cancelsTouchesInView:

ジェスチャが認識されたときにタッチがビューに配信されるかどうかに影響するブール値。

@property(nonatomic) BOOL cancelsTouchesInView

討論

このプロパティが YES (デフォルト) で、レシーバーがジェスチャを認識すると、保留中のそのジェスチャのタッチはビューに配信されず、以前に配信されたタッチは、ビューに送信された touchesCancelled:withEvent: メッセージによってキャンセルされます。ジェスチャ レコグナイザーがそのジェスチャを認識しない場合、またはこのプロパティの値が NO の場合、ビューはマルチタッチ シーケンスのすべてのタッチを受け取ります。

于 2012-10-24T03:38:54.183 に答える