为啥 UICollectionView 不滚动其中的 UIButtons?

Posted

技术标签:

【中文标题】为啥 UICollectionView 不滚动其中的 UIButtons?【英文标题】:Why does UICollectionView not scroll with UIButtons inside it?为什么 UICollectionView 不滚动其中的 UIButtons? 【发布时间】:2015-02-18 06:56:17 【问题描述】:

鉴于以下情况:

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

问题:

UICollectionView 在滑动/拖动时不会滚动。 UIButtons 会截取触摸,并使其难以拖动 UICollectionView。

另外:

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

**为什么 UICollectionViewCells 中的 UIButtons 会阻止 UICollectionView 响应拖动/滑动手势? **

【问题讨论】:

【参考方案1】:

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

解决方案:

从 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 或类似的。

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

【讨论】:

以上是关于为啥 UICollectionView 不滚动其中的 UIButtons?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 UICollectionView 在滚动其单元格的滚动视图后不再调用 didSelectItemAtIndexPath ?

UICollectionView 加载延迟并且滚动非常颠簸

在 UICollectionView 中滚动 2-3 次后单元格消失

如何使用 UICollectionView 滚动到下一项

NSTimer 和 UICollectionView

为啥我的 uicollectionview 不随底层 uiscrollview 一起移动?