如何在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
相关产品推荐
相关产品推荐

