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;
}
関連記事
-
-
AdMob組み込み覚書
書籍ではコレがかなり参考になるのでご紹介。 表題の通りで、組み込みで要注意っぽい部分だけを
-
-
iPad用storyboard⇔iPhone用Storyboardへの変換
iPad用アプリとしてiPad用前提のstoryboardから、iPhone対応にするにあたり、si
-
-
NSStringのフォーマット書式
Appleのページになく、IEEEのprintfフォーマットのページにあるので、C言語と親しくしてな
-
-
iOSシミュレータの帯域制限をテストする
iOSシミュレータで通信帯域制限をテストしたいと思ったんですが、Xcode8からXcode7.xとは
-
-
RealmのList
とArray の相互変換によるマップ Realm+ObjectMapperを使って、RealmのオブジェクトをJSON変換してたのですが
-
-
UIAlertControllerの取り扱い
旧聞ですが日本語版のStackOverflowが始動したようですね。 個人的な印象は「フィルタされ
-
-
iOS9でURLスキームを登録する
私事ですが、iOS8から対応はしたいということで検証用に使っている自分のiPhoneもiOS8でがん
-
-
コードでiPhone6 Plusを識別する簡単な方法
表題の通り、コードでiPhone6 Plusを識別する簡単な方法です。 iPhone6 Plu
-
-
Bitbucketの画面の日本語化/コミット時に同時プッシュを行う
前回の記事の続きで、Bitbucketの画面の日本語化と、Xcodeでコミットするときに同時にpus
-
-
StoryboardからPopoverを作っても位置合わせコードは必要
これだけだとわかりづらいんですが。 XcodeのStoryboardから、Segueを"Prese
- PREV
- iOS7の青色
- NEXT
- UISplitViewControllerの仕切り線の色を設定
