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

如何在UICollectionView中仅允许向前滑动 禁止向后返回已浏览cell

实现方案

核心逻辑是锁定当前已浏览到的页面的最小滚动偏移量,禁止滚动到偏移量更小的上一页区域即可实现滑走不可回退的效果,具体实现步骤如下:

步骤1:定义全局记录属性

// 横向滚动场景下允许的最小x偏移量,纵向滚动请改为minAllowedOffsetY
var minAllowedOffsetX: CGFloat = 0
// 记录当前已浏览到的最新页码
var currentPageIndex: Int = 0

步骤2:实现UIScrollViewDelegate代理方法

UICollectionView继承自UIScrollView,将collectionView的delegate设置为当前控制器后实现以下代理方法:

监听滚动结束事件,更新锁定位置

func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
    // 横向滚动计算逻辑,纵向滚动请替换width为height、x为y
    let pageWidth = collectionView.frame.width
    // 存在item间距时,pageWidth需要加上minimumLineSpacing的值
    let currentPage = Int(scrollView.contentOffset.x / pageWidth)
    
    // 仅当滑到更新的页面时,更新锁定的最小偏移量
    if currentPage > currentPageIndex {
        currentPageIndex = currentPage
        minAllowedOffsetX = CGFloat(currentPageIndex) * pageWidth
    }
}

实时限制滚动偏移量,禁止回退

func scrollViewDidScroll(_ scrollView: UIScrollView) {
    if scrollView.contentOffset.x < minAllowedOffsetX {
        scrollView.contentOffset = CGPoint(x: minAllowedOffsetX, y: scrollView.contentOffset.y)
    }
}

可选优化:提升拖拽手感

如果需要避免拖拽回退时出现的回弹卡顿感,可以额外实现以下代理方法,直接修改拖拽结束后的目标偏移量:

func scrollViewWillEndDragging(_ scrollView: UIScrollView, withVelocity velocity: CGPoint, targetContentOffset: UnsafeMutablePointer<CGPoint>) {
    if targetContentOffset.pointee.x < minAllowedOffsetX {
        targetContentOffset.pointee.x = minAllowedOffsetX
    }
}

内容的提问来源于stack exchange,提问作者Avinash Sharma

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 17:06:08