为啥 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 ?