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

如何让UIScrollView停在滚动位置?滚动到特定位置停止滚动的实现问题

解决UIScrollView滚动到特定位置时停止滚动的问题

我之前也踩过这个坑!你一开始尝试的代码之所以无效,核心原因是:当你设置scrollView.isScrollEnabled = false时,UIScrollView会默认将contentOffset重置为初始位置(0,0),这是系统的内置行为,所以根本没法停在你想要的SpecificY位置。

正确的实现思路

我们不需要禁用滚动,而是直接控制scrollView的偏移位置,或者在滚动结束前预判并修正目标偏移,两种方案都能完美解决问题:

方案1:实时拦截滚动并修正偏移

适合需要实时拦截的场景(比如用户缓慢滚动时也要立刻停住),在scrollViewDidScroll中检测偏移,当到达目标位置时直接锁定:

// 假设你已经定义了目标位置常量
let SpecificY: CGFloat = 100.0

func scrollViewDidScroll(_ scrollView: UIScrollView) {
    let currentScrollY = scrollView.contentOffset.y
    stopScrollAtTargetPosition(scrollView: scrollView, currentY: currentScrollY)
}

func stopScrollAtTargetPosition(scrollView: UIScrollView, currentY: CGFloat) {
    guard currentY <= SpecificY else { return }
    
    // 直接设置偏移到目标位置,关闭动画避免跳动
    scrollView.setContentOffset(CGPoint(x: 0, y: SpecificY), animated: false)
    // 移除所有滚动动画,确保scrollView立刻停止
    scrollView.layer.removeAllAnimations()
}

方案2:拖拽结束时预判并修正目标偏移

这种方式性能更优,适合拖拽滚动的场景,它在系统计算最终滚动位置时直接修改,不需要实时监听滚动回调:

let SpecificY: CGFloat = 100.0

func scrollViewWillEndDragging(_ scrollView: UIScrollView, withVelocity velocity: CGPoint, targetContentOffset: UnsafeMutablePointer<CGPoint>) {
    // 如果系统计算的目标偏移会超过SpecificY,直接替换为我们想要的位置
    if targetContentOffset.pointee.y <= SpecificY {
        targetContentOffset.pointee = CGPoint(x: 0, y: SpecificY)
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:31:51