调用 didHighlightItemAtIndexPath 而不调用 UICollectionView 的 didSelectItemAtIndexPath

Call to didHighlightItemAtIndexPath without a call to didSelectItemAtIndexPath for UICollectionView

我有一个 UICollectionView,我在其中覆盖了 hitTest:withEvent: 在我的 UICollectionViewCells 中,以便允许在单元格外的点击注册为单元格上的点击。

当我执行此操作并点击现在注册为点击的单元格外部时,我收到了对 didHighlightItemAtIndexPath 和 didUnhighlightItemAtIndexPath 的调用,但没有收到对 didSelectItemAtIndexPath 的调用。如果我在单元格内部点击,我会像以前一样获得所有预期的突出显示和 select 项目调用。

我没有设置任何自定义手势识别器,也没有覆盖 touchesBegan 或类似的东西。

那么有谁知道在什么情况下你会收到 didHighlightItemAtIndexPath 的调用而没有调用 didSelectItemAtIndexPath?有什么方法可以调用我的 didSelectItemAtIndexPath 吗?谢谢。

编辑

我忘了提到我的 UICollectionView 在 Today Widget 中,因此它包含在通知中心滚动视图中。如果我将我的 select 代码移动到 didUnhighlightItemAtIndexPath 中,那么当您在单元格外部点击时它会被调用,但结果是如果没有 selecting 其中一个单元格,您实际上无法滚动通知中心.

所以也许我在这里遇到的突出显示和 selecting 之间的区别与滚动视图响应器取消单元格外的 selection 有关?

好的,我知道发生了什么事了。

我向我的 UICollectionView 添加了一个新的 UITapGestureRecognizer。像这样实施它让我找到了解决方案:

- (void)cellSingleTap:(UITapGestureRecognizer *)sender
{
    CGPoint point = [sender locationInView:collectionView_];
    NSIndexPath *indexPath = [collectionView_ indexPathForItemAtPoint:point];
    [ .... ]
}

当我检查突出显示但没有 selection 时返回的点时,很明显,当点击的点位于集合视图布局的部分插图内时,就会发生这种情况。当点击位于插图部分时,indexPathForItemAtPoint 调用返回 nil。

所以基本上集合视图会突出显示,但不会 select,在单元格外部但在其部分插图内的点击。只要点击在单元格外而不是在插图内,这些点击就会导致调用 didSelectItemAtIndexPath。

由于我希望插图中的点击计为单元格上的点击,因此我能够通过在调用 indexPathForItemAtPoint 之前调整点击点来解决此问题。