*

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

関連記事

iOS6時代のアプリのiOS7への対応

やや古い情報になるが、iOS7対応に関して自分がやったことの覚え書き。いろんな所から拾って来た情

記事を読む

Bitbucket課題の記法サンプル

Bitbucketの課題、およびwikiで利用できる記法についての記事です。 利用できる記法に

記事を読む

NSStringのフォーマット書式

Appleのページになく、IEEEのprintfフォーマットのページにあるので、C言語と親しくしてな

記事を読む

UIButtonのタイトル変更時のチラつき抑制

久しぶりにXcode+Objective-Cでアプリを作っていたら、UIButtonのタイトルを動的

記事を読む

実機テストしたときのデータを取り出す

Xcodeでコンパイルして実機テストしている場合に、テストデータを実機から取り出す方法です。 以下

記事を読む

App Storeのページにアプリケーションから直接アクセスする方法

去年(2013年)の秋ごろ、iOS7の出始めの時期に書かれたblog記事などを参考にすると、iOS6

記事を読む

UIActionSheetの文字がブレて多重表示される

UIActionsheetを使っていて、iOS7/iPadの組み合わせで起こる不具合らしき挙動が起こ

記事を読む

iOS9でのNSFetchedResultsContollerDelegateの挙動

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

記事を読む

Realmで==ができなかった

最近Realm Swiftを使ってて、引っかかったところがあるのでメモ。 Realmのオブジェクト

記事を読む

ENMLからHTMLへの変換

最近EvernoteAPIをいじっているので、コレに関するノウハウをとりあえず断片的に引っかかったと

記事を読む

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

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

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

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

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

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

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

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

NXDrawKitを導入してみる

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

→もっと見る

    PAGE TOP ↑