如何在UICollectionView滚动时点击cell立即触发didSelectItemAt方法?
解决UICollectionView滚动时点击Cell无法立即触发didSelectItemAt的问题
这个问题的根源在于UICollectionView继承自UIScrollView,而UIScrollView默认开启了delaysContentTouches属性——这个属性会让滚动视图在收到触摸事件后先等待一小段时间,判断用户是要执行滚动操作还是点击操作,所以在滚动过程中,点击事件会被延迟到滚动结束才会触发didSelectItemAt。
要实现滚动时点击Cell立即触发代理方法,你只需要做以下两步:
1. 关闭CollectionView的触摸延迟
在你的viewDidLoad方法中,添加一行代码关闭delaysContentTouches:
override func viewDidLoad() { super.viewDidLoad() // 保留你已有的dataSource、delegate设置 cardCollectionView.delaysContentTouches = false }
2. 自定义CollectionView确保触摸事件不被取消(可选但推荐)
如果第一步设置后仍存在问题,可以自定义UICollectionView并重写touchesShouldCancel(in:)方法,避免Cell的触摸事件被滚动视图中途取消:
class CustomCardCollectionView: UICollectionView { override func touchesShouldCancel(in view: UIView) -> Bool { // 针对自定义的CardCell,不取消触摸事件 if view is CardCell { return false } return super.touchesShouldCancel(in: view) } }
之后把你的cardCollectionView的类改为CustomCardCollectionView即可:
- 若用Storyboard创建,在Identity Inspector面板修改类名;
- 若用代码创建,直接初始化这个自定义类。
关于你现有设置的说明
你之前设置的isUserInteractionEnabled、allowsMultipleSelection等属性都是正确的,不需要修改。完成上述两步后,运行项目测试,滚动过程中点击Cell应该就能立即触发didSelectItemAt方法了。
内容的提问来源于stack exchange,提问作者Michael
相关产品推荐
相关产品推荐

