UITableViewで長押しイベントを実装!

これはたぶん普通にGoogleで検索するといくつか見つかると思う。
で、実際にみつけて実装したのだけど、UITableViewを編集モードにしてソートを有効にすると干渉しあって上手くイベントがとれない。
まぁ、これは考えてみれば長押し後にパン(Drag)が動くので当たり前といえば当たり前だな。

と、ストレートに問題を解決してくれる情報を探したけど見つからなかったので、なんとなく想像するままに実装。

たぶん、パンジェスチャーが失敗したときだけロングタップを有効にしてやればいいので、これはダブルタップとシングルタップの干渉で使う手法が多分つかえるだろうと。

なので、まずはUITableViewのパンジェスチャーを探す。

// テーブルのパンジェスチャーを探す
__weak UIPanGestureRecognizer* panGestureRecognizer = nil;
for (UIGestureRecognizer* ges in tableView.gestureRecognizers) {
 if ([ges isKindOfClass:[UIPanGestureRecognizer class]]) {
 panGestureRecognizer = (UIPanGestureRecognizer*)ges;
 break;
 }
}

以外に簡単に見つかった!

あとは、これをロングタップと干渉しないように調整

// テーブルの長押しジェスチャー登録
if (panGestureRecognizer) {
 UILongPressGestureRecognizer *longTap = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(_listLongTap:)];
 longTap.allowableMovement = 15;         // 指の許容移動距離
 longTap.minimumPressDuration = 0.6f;    // 長押し時間(秒)
 [panGestureRecognizer requireGestureRecognizerToFail:longTap];
 [tableView addGestureRecognizer:longTap];
}

チャンチャンっと♪

たまには填まらないで実装できるときもある(笑)