在UIScrollView中禁用垂直滚动

时间:2011-02-23 19:00:00

标签: iphone ios uiscrollview

IB中有一个选项可以取消选中滚动视图上的垂直滚动,但它似乎无法正常工作。

如何将scrollview设置为仅水平滚动,而不是在代码而不是IB中垂直滚动?

13 个答案:

答案 0 :(得分:134)

自iOS7以来:

首先:内容大小宽度必须等于滚动视图的宽度

第二:在你的initWithNibName中:

self.automaticallyAdjustsScrollViewInsets = NO;

就是这样。

答案 1 :(得分:116)

尝试将contentSize的高度设置为scrollView的高度。然后应该禁用垂直滚动,因为没有任何东西可以垂直滚动。

scrollView.contentSize = CGSizeMake(scrollView.contentSize.width,scrollView.frame.size.height);

答案 2 :(得分:49)

是的,pt2ph8的答案是对的,

但是如果由于某些奇怪的原因你的contentSize应该高于UIScrollView,你可以禁用实现UIScrollView协议方法的垂直滚动

 -(void)scrollViewDidScroll:(UIScrollView *)aScrollView;

只需在你的UIViewController

中添加它
float oldY; // here or better in .h interface

- (void)scrollViewDidScroll:(UIScrollView *)aScrollView
{
    [aScrollView setContentOffset: CGPointMake(aScrollView.contentOffset.x, oldY)];
    // or if you are sure you wanna it always on top:
    // [aScrollView setContentOffset: CGPointMake(aScrollView.contentOffset.x, 0)];
}

它只是当用户滚动你的UIScrollView时调用的方法,并且这样做会强制它的内容始终保持相同.y

答案 3 :(得分:22)

包括以下方法

-(void)viewDidLayoutSubviews{
    self.automaticallyAdjustsScrollViewInsets = NO;
}

并将滚动视图的内容大小宽度设置为等于滚动视图的宽度。

答案 4 :(得分:17)

我更新了内容大小以禁用垂直滚动,并且仍然保持滚动的能力。然后我发现我也需要禁用垂直反弹,以完全禁用滚动。

也许有人也有这个问题。

答案 5 :(得分:17)

您需要在内容大小上传递0才能禁用您想要的方向。

禁用垂直滚动

scrollView.contentSize = CGSizeMake(0,scrollView.contentSize.height);

禁用水平滚动

public static void print(LinkedList<Integer> lli)

答案 6 :(得分:13)

- (void)scrollViewDidScroll:(UIScrollView *)aScrollView
{
    [aScrollView setContentOffset: CGPointMake(aScrollView.contentOffset.x,0)];

}

您必须已确认到UIScrollViewDelegate

aScrollView.delegate = self;

答案 7 :(得分:3)

只需将y设置为始终位于顶部。 需要符合UIScrollViewDelegate

func scrollViewDidScroll(scrollView: UIScrollView) {
        scrollView.contentOffset.y = 0.0
}

这将保持滚动的减速/加速效果。

答案 8 :(得分:3)

在iOS 11上,如果您有兴趣创建一个贴在屏幕边界而不是安全区域的滚动视图,请记得添加以下内容。

if (@available(iOS 11.0, *)) {
    [self.scrollView setContentInsetAdjustmentBehavior:UIScrollViewContentInsetAdjustmentNever];
}

答案 9 :(得分:1)

iOS11 中,可以使用以下属性

let frameLayoutGuide: UILayoutGuide

如果您将 frameLayoutGuide.topAnchor frameLayoutGuide.bottomAnchor 的约束设置为您的 scrollView 子视图的相同锚点, / em>,则将禁用垂直滚动,并且 scrollView 的高度将等于其子视图的高度。

答案 10 :(得分:1)

最明显的解决方案是禁止子类中的y坐标更改。

override var contentOffset: CGPoint {
  get {
    return super.contentOffset
  }
  set {
    super.contentOffset = CGPoint(x: newValue.x, y: 0)
  }
}

在以下情况下,这是唯一合适的解决方案:

  1. 您被禁止或者只是不想使用委托。
  2. 您的内容高度大于容器高度

答案 11 :(得分:0)

很多答案包括将contentOffset设置为0。我遇到了一种情况,我希望将scrollView内部的视图居中。这为我完成了工作:

public func scrollViewDidScroll(_ scrollView: UIScrollView) {
    scrollView.contentOffset.y = -scrollView.contentInset.top
}

答案 12 :(得分:0)

我觉得你可以

  1. 将 directionalLockEnabled 设置为 true
  2. 设置 contentView 的宽度等于 superView 的宽度。

应该可以。