実行したいのは、適切なジェスチャに応答するジェスチャレコグナイザをUITableViewに追加することです。UITableViewはすでにセルの選択にタップを使用しているため、UITapGestureRecognizerを使用しないことをお勧めします。そのため、UILongPressGestureRecognizerを試してみることをお勧めします。これを行う方法の小さなサンプルを次のようにまとめました。
私のviewDidLoadで、私は次のことを行いました。
UILongPressGestureRecognizer *gesture = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(handleLongPressFrom:)];
[self.tableView addGestureRecognizer:gesture];
handleLongPressFrom:は次のとおりです。
- (void)handleLongPressFrom:(UILongPressGestureRecognizer *)recognizer {
NSLog(@"handleLongPressFrom: %@", recognizer);
// Add real code here
}
ジェスチャーの完全なリストはここにあります。
ああ、それでもタップを使いたいのなら、このスタックオーバーフローの質問をチェックしてください。提示された方法が完全に機能するかどうかはわかりませんが、開始するのに適した場所です。
UITableViewでのUITapGestureRecognizerの使用:わかりました。タップジェスチャはユースケースに適しているように思われるので、次のことを試してみてください。ステップ1は、長押しジェスチャの代わりにタップジェスチャを使用して、上記のジェスチャレコグナイザを設定することです。
viewDidLoadのコードは非常に似ていますが、重要な追加があります...
UITapGestureRecognizer *gesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTapFrom:)];
// we need to set the gesture delegate so we can allow the tap to pass through to the
// UITableViewCell if necessary.
gesture.delegate = self;
[self.tableView addGestureRecognizer:gesture];
handleTapFrom:関数はほとんど同じですが、パラメーターとしてジェスチャレコグナイザーが異なります。
- (void)handleTapFrom:(UITapGestureRecognizer *)recognizer {
NSLog(@"handleTapFrom: %@", recognizer);
// Add real code here
}
このアプローチの主な変更点は、UIGestureRecognizerDelegateプロトコルを実装する必要があることです。私たちの目標は、タップジェスチャがUITableViewを通過してそのサブビュー(つまり、UITableViewCellとそのコンポーネント)に到達できるようにすることなので、gestureRecognizer:shouldRecieveTouch:関数を実装する必要があります。次の実装は、あなたが試みていることをカバーするはずです。
#pragma mark UIGestureRecognizerDelegate methods
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
// If the view that is touched is not the view associated with this view's table view, but
// is one of the sub-views, we should not recognize the touch.
if (touch.view != self.tableView && [touch.view isDescendantOfView:self.tableView]) {
return NO;
}
return YES;
}
isDescendantOfView:関数は、テスト対象のビューがテストを実行しているビューと同じである場合にYESを返すため、その場合に個別に対応する必要があります。self.tableViewの代わりにgestureRecognizer.viewを使用してこの関数を生成できますが、この場合は必要ないと思いました。