You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 04:23:57