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

如何实现UIScrollView仅支持左右及向下滚动?禁止向上滚动

嘿,这个问题我刚好在项目里处理过好几次,给你分场景细说解决方案:

实现UIScrollView单一方向滚动

这里有两种常用方案,根据你的需求选:

  • 方案1:利用系统自带的方向锁定
    设置isDirectionalLockEnabled = true,同时把不需要滚动方向的contentSize设为和scrollView的bounds尺寸一致。比如要仅垂直滚动,就把contentSize.width设为scrollView的宽度,contentSize.height设为大于scrollView高度的值。
    这个属性的逻辑是:当用户开始向一个方向滚动时,自动锁定另一个方向的滚动,适合需要"优先单一方向"的场景。代码示例:

    scrollView.isDirectionalLockEnabled = true
    scrollView.contentSize = CGSize(width: scrollView.bounds.width, height: 1000) // 仅垂直滚动
    
  • 方案2:完全禁止某个方向(强制锁定)
    如果需要彻底禁止某个方向的滚动(比如完全不能横向动),可以通过UIScrollViewDelegate的scrollViewDidScroll方法强制修正contentOffset:

    func scrollViewDidScroll(_ scrollView: UIScrollView) {
        // 仅允许垂直滚动,锁定x轴偏移为0
        scrollView.contentOffset.x = 0
    }
    

    OC版本:

    - (void)scrollViewDidScroll:(UIScrollView *)scrollView {
        scrollView.contentOffset = CGPointMake(0, scrollView.contentOffset.y);
    }
    

    记得提前设置scrollView.delegate = self哦。

禁止向上滚动,仅允许右、左及向下滚动

这个需求的核心是限制contentOffset的y值不能小于0(因为UIScrollView默认原点在左上角,向上滚动时contentOffset.y会变为负数),同时不对x轴做限制,具体实现:

  1. 首先确保已经设置了scrollView的代理:
scrollView.delegate = self
  1. 在代理方法中拦截并修正contentOffset:
func scrollViewDidScroll(_ scrollView: UIScrollView) {
    // 禁止向上滚动,强制y轴偏移≥0
    if scrollView.contentOffset.y < 0 {
        scrollView.contentOffset.y = 0
    }
    // x轴不做任何限制,保留默认的左右滚动逻辑
}

OC版本:

- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
    if (scrollView.contentOffset.y < 0) {
        scrollView.contentOffset = CGPointMake(scrollView.contentOffset.x, 0);
    }
}

如果你的scrollView开启了verticalBounces,这个逻辑会保留向下的回弹效果(因为向下滚动时y值会超过contentSize.height - scrollView.bounds.height,我们没有限制这个),但向上的回弹会被立刻拉回顶部,完美符合你的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:23:37