UITableViewCellのロングタップ
公開日:
:
最終更新日:2016/07/20
Tips UIGestureRecoginizer, UITableView, UITableViewCell
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; }
関連記事
-
-
Xcode10からのimage literal / color literalの指定方法
アセットにあるUIImageの直接指定が可能なImage literalですが、気がついたらアセット
-
-
Xcode5.1のInterfaceBuilderにおける地味な変更点
iOS7.1に合わせてXcode5.1がリリースされました Xcode Release N
-
-
Xcode8で余計なログを抑制する
Xcode8に更新してから、妙にログが増えたので、NSLogで明示したのと実行時エラー以外のログを吐
-
-
アプリ内で自動スリープの設定を無効化する
「設定」アプリ内で設定したスリープ時間設定を無効にするためのコード。 アプリがバックグラウンドにな
-
-
UIActionSheetが消えるときにキーボード表示/非表示通知が来る
UITextViewやUITextField編集中にアクションシートを表示すると、アクションシート
-
-
UIAlertControllerの取り扱い
旧聞ですが日本語版のStackOverflowが始動したようですね。 個人的な印象は「フィルタされ
-
-
NSAttributedStringをローカライズする方法
NSAttributedStringをLocalizeするうまい方法はないものかと探したら、これが手
-
-
Bitbucketの画面の日本語化/コミット時に同時プッシュを行う
前回の記事の続きで、Bitbucketの画面の日本語化と、Xcodeでコミットするときに同時にpus
-
-
HTMLParserを修正する
HTMLスクレイピングしてる時に役立つライブラリであるObjective-C-HMTL-Parser
-
-
バージョンアップ版があることを通知する
拍子抜けするほど簡単だったので、「アプリのバージョンアップの通知をどうするか」という話についてTip
- PREV
- iOS7の青色
- NEXT
- UISplitViewControllerの仕切り線の色を設定