为什么 UICollectionView 不滚动其中的 UIButtons?

Why does UICollectionView not scroll with UIButtons inside it?

给定以下场景:

有一个包含 UICollectionViewCells 的 UICollectionView(自然)。每个 UICollectionViewCell 都包含一个 UIButton 以及与之关联的目标操作。

问题:

UICollectionView 不会在 swipe/drag 上滚动。 UIButtons 反而会拦截触摸,并使拖动 UICollectionView 变得困难。

此外:

UIButton 设置为 UIControlEventTouchUpInside UICollectionView 设置为 canCancelTouches = YES

**为什么 UICollectionViewCells 中的 UIButton 会阻止 UICollectionView 响应 drag/swipe 手势? **

UICollectionView 不能正常滚动的原因是因为 UIButton 正在拦截并重新路由响应链。

解决方案:

从 UICollectionViewCell 中移除 UIButton。
而是使用 UICollectionViewDelegate 的委托方法:

- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath

解释:

当我们向 UICollectionViewCell 添加一个 UIButton 时,我们认为捕获点击的最佳方式是向单元格添加一个按钮。但是,通过添加 UIButton,我们打破了响应链。

我们不需要 UICollectionViewCell 中的按钮,因为 UICollectionViewCell 已经使用它的委托方法检测点击事件:

- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath

使用提供的方法检测收集单元格上的点击,并将 UIButtons 替换为 UIImageView-s 或类似的。

我们在使用集合单元格时不需要按钮的事件处理。