*

UITableViewCellのロングタップ

公開日: : 最終更新日:2016/07/20 Tips , ,

UITableViewCellをロングタップしたときに、タップされたセルを認識しつつメニューを出したい時の手順。

(1)セルごとにGestureRecoginizerを設定するのではなく、UITableView自体にジェスチャを設定する。
(2)UIGestureRecoginizerでLongPressを受け取った時に、UITableView座標系でロングタップ点をCGPointで作成する。受け取ったジェスチャ(gesture)に対してlocationInViewメソッドを呼べば、指定したViewの座標系のCGPointが得られる。

    CGPoint point = [gesture locationInView:self.tableView];

(3)先ほどの手順で得られてCGPointを使ってtableViewのindexPathForeRowAtPointメソッドを呼び、NSIndexPathを得る。これがタップされたセルのIndexPath

    NSIndexPath* indexPath = [self.tableView indexPathForRowAtPoint:];

これでIndexPathが得られる。IndexPathに対応する情報(セルの元情報を引きたい場合などは、大抵「別ArrayのIndexPath.row番目の要素」とか、fetchedResultControllerのobjectAtIndexPathに対応とか、そういう感じになるだろう)を引っ張って処理をする。
Popoverを表示する場合は矢印が示すViewとそのrectが必要になるので、cellForRowAtIndexPathメソッドでUITableViewCellを引っ張ってきて、以下の例(UITableViewCell* cell, UIActionSheet* actionSheetの場合)のように指定するとよい。

    [actionSheet showFromRect:cell.bounds inView:cell.contentView animated:YES];

また、UIGestureRecoginizerは「ロングタップと認識した瞬間」と「ロングタップ終了」の2回呼び出されるので、GestureのStateを確認して
「UIGestureRecognizerStateBegan(認識した瞬間)の場合」だけ処理をするようにすれば、ロングタップするとメニューが出る、というような挙動を実装できる。
代わりにUIGestureRecognizerStateEndedを用いれば、ロングタップ終了時(指を離した時)に動作するようになる。

if([gesture state] != UIGestureRecognizerStateBegan){
    // --- ロングタップ認識時にのみ駆動
    return;
}

参照サイト:
Qiita
A-LOG

関連記事

警告を無視する

HokusaiというライブラリをObj-Cのアプリで使うために奮闘してるのですが(これはこれで別記事

記事を読む

ソースコードからStoryboardにアクセスする

複数のStoryboardを利用して、自分以外のStoryboardに遷移させるような展開をしたい場

記事を読む

iOS8のシミュレーターでLocalizationのテストをする

iOS8.1のシミュレーターでは、従前できていたシミュレーター内での「設定」(Setting)からの

記事を読む

iOS9でのNSFetchedResultsContollerDelegateの挙動

ハマったので短いながらメモしたいと思います。 NSFetchedResultsContollerD

記事を読む

GoogleスプレッドシートからCSVにエクスポートしたデータを得る方法

情報がない中さんざ苦労しましたが、Googleスプレッドシート(の最初のシート)をCSVとしてエクス

記事を読む

UIAutomation関連覚書

割りと忘れがちなので、自分用備忘録を兼ねて、UIAutomationに関連するtips的なものをまと

記事を読む

iOSシミュレータの帯域制限をテストする

iOSシミュレータで通信帯域制限をテストしたいと思ったんですが、Xcode8からXcode7.xとは

記事を読む

UICollectionViewが画面回転した時にレイアウトが崩れた時の対応

UICollectionViewCellのサイズを、内容に合わせて動的に変えた時に起こる問題に関して

記事を読む

StoryboardからPopoverを作っても位置合わせコードは必要

これだけだとわかりづらいんですが。 XcodeのStoryboardから、Segueを"Prese

記事を読む

UITableViewのセルセパレータが画像の下部分だけ切れる場合の対応

iOS7のUItableViewCellだと、UITableView.imageViewに画

記事を読む

Xcode10からのimage literal / color literalの指定方法

アセットにあるUIImageの直接指定が可能なImage litera

Xcode11でのバージョン番号の取得方法

Xcode11になってバージョン番号をスクリプトから得て自動で更新する

GoogleスプレッドシートからCSVにエクスポートしたデータを得る方法

情報がない中さんざ苦労しましたが、Googleスプレッドシート(の最初

画面回転をしたあとに、UITextViewの先頭を表示する

回転によりサイズが可変するUITextViewで、縦向き(ポートレイト

NXDrawKitを導入してみる

ACEDrawingViewがObj-Cで書かれていて、いまいちメンテ

→もっと見る

    PAGE TOP ↑