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; }
関連記事
-
-
UICollectionViewのヘッダとフッタの設定
UICollectionViewで慣れないのがヘッダフッタで、毎度「どうやって設定するんだっけ…」と
-
-
NSStringのフォーマット書式
Appleのページになく、IEEEのprintfフォーマットのページにあるので、C言語と親しくしてな
-
-
CoreDataのソートとsectionNameKeyPathの関係
CoreDataをフェッチするときに、indexPathのsectionにできるsectionNam
-
-
plistファイルに色を入れる
plistファイル中にUIColorを入れたい!という場合。普通RGBAの値を数値で入れるとかするけ
-
-
画面回転をしたあとに、UITextViewの先頭を表示する
回転によりサイズが可変するUITextViewで、縦向き(ポートレイト)から横向き(ランドスケープ)
-
-
NSDictionary/NSMutableDictionaryの”valueForKey:”と”objectForKey:”の違い
表題にある通り、似ていて混同する(そして、取り違えても「たいてい」普通に動作する)NSDiction
-
-
UISplitViewControllerの仕切り線の色を設定
UISplitViewControllerで、iPadを横向き(Landscape)にしたときの2つ
-
-
AVAudioPlayerの初回再生遅延
ちょっとした効果音の再生にAVAudioPlayerを使っているのですが、どうも初回の効果音ロードの
-
-
UIAlertControllerの取り扱い
旧聞ですが日本語版のStackOverflowが始動したようですね。 個人的な印象は「フィルタされ
-
-
preferredContentSizeをUINavigationContorllerのPop時に再設定する
popoverで表示しているViewControllerのサイズを、他のViewController
- PREV
- iOS7の青色
- NEXT
- UISplitViewControllerの仕切り線の色を設定