locationInViewを使用してタッチポイントを取得し、これをコレクションビューのindexPathForItemAtPointに渡します。セルのインデックスパスを取得しますが、UICollectionReusableView(ヘッダー/フッター)は常にnilを返すため、取得しません。
3 に答える
ヘッダーには実際にはindexPathがありません。行0として報告されますが、セクションの最初のセルも報告されます。
この問題は、Integerプロパティを持つUITapGestureRecognizerの単純なサブクラスを作成することで簡単に解決できます。次のインターフェイスと空の実装を、ViewControllerの.m
ファイルの先頭に配置するだけです。
@interface HeaderTapRecognizer : UITapGestureRecognizer
@property (nonatomic, assign) NSInteger sectionNumber;
@end
@implementation HeaderTapRecognizer
@end
補足ビューを提供するときは、これらのレコグナイザーの1つを追加し、セクション番号を設定するだけです。
HeaderTapRecognizer *recognizer = [[HeaderTapRecognizer alloc] initWithTarget:self action:@selector(headerTapped:)];
recognizer.sectionNumber = indexPath.section;
[cell addGestureRecognizer:recognizer];
これで、アクションブロックのセクション番号にアクセスできます。
- (void)headerTapped:(id)sender
{
HeaderTapRecognizer *htr = sender;
NSInteger sectionNumber = htr.sectionNumber;
NSLog(@"Header tapped for index Section %d",sectionNumber);
}
UITapGestureRecognizer
各ヘッダービューを作成して添付します。UIControl
別のオプションは、ヘッダービューごとにのカスタムサブクラスを提供することです。
おそらくこれを手伝うには遅すぎますが、おそらく他の誰かが私がしたようにこれを打つでしょう。問題は、ヘッダーに意味のあるindexPathがないことです(常に0,0を返すように見えます)。
とにかく、ポイントを取得すると、indexPathの代わりに、ヘッダーのサブビュー内にあるかどうかを確認しています。
CGPoint point = [sender locationInView:collectionView];
if (CGRectContainsPoint(CGRectMake(0.0f,0.0f,140.0f,140.0f), point))
NSLog(@"Point was inside header");
これは私のインスタンスでのみ機能します。これは、ヘッダーのサイズがわかっていて、collectionViewにはセクション(0)が1つしかないため、collectionview内でその位置を安全に想定できるためです。
HTH