使用点击手势时如何获取UICollectionView标头的索引路径?

时间:2013-02-17 06:52:45

标签: ios objective-c ios6 uicollectionview

我使用locationInView获取触摸点并将其传递给集合视图的indexPathForItemAtPoint。我将得到一个单元格的索引路径,但从来没有UICollectionReusableView(页眉/页脚),因为它总是返回nil。

3 个答案:

答案 0 :(得分:7)

标头实际上没有indexPath;它报告为第0行,但该部分中的第一个单元格也是如此。

您可以通过创建具有Integer属性的UITapGestureRecognizer的简单子类来轻松解决此问题,只需将以下接口和空实现放在View Controller的.m文件的顶部:

@interface HeaderTapRecognizer : UITapGestureRecognizer
@property (nonatomic, assign) NSInteger sectionNumber;
@end

@implementation HeaderTapRecognizer
@end

当您提供补充视图时,只需添加其中一个识别器并设置章节号:

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);
}

答案 1 :(得分:1)

我会为每个标题视图创建并附加UITapGestureRecognizer。另一种选择是为每个标题视图提供UIControl的自定义子类。

答案 2 :(得分:1)

可能为时已晚,无法帮助解决这个问题,但也许其他人会像我一样打到这个。问题是标题没有有意义的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中的位置,因为collectionView只有一个section(0)。

HTH