如何禁用UIScrollView的水平滚动?

Rah*_*yas 87 objective-c uiscrollview ios

我有一个UIView像iPhone的Springboard.我使用UIScrollView和创建它UIButtons.我想禁用所述scrollview上的水平滚动.我只想垂直滚动.我该如何做到这一点?

Dav*_*ong 123

你必须设置的contentSize属性UIScrollView.例如,如果您UIScrollView的宽度为320像素(屏幕宽度),那么您可以这样做:

CGSize scrollableSize = CGSizeMake(320, myScrollableHeight);
[myScrollView setContentSize:scrollableSize];
Run Code Online (Sandbox Code Playgroud)

UIScrollView这时只会垂直滚动,因为它已经可以水平显示的一切.

  • 你好.这个解决方案工作得很好!感谢那.我尝试将静态宽度设置为0.对我来说这也适用.我不知道以后是否会有一些副作用.但如果一个人不知道尺寸(即iPhone和iPad的通用代码),这个效果很好! (6认同)
  • 我认为最好做CGSizeMake(0,myScrollableHeight),因此即使并非所有子视图都显示,也会禁用水平滚动. (5认同)

Din*_*aja 86

更新:( @EranMarom指出他的评论后)

您可以在方法中停止水平滚动或垂直滚动ScrollViewDelegate.这是怎么样的,

停止水平滚动:

如果要水平滚动,则需要增加contentOffset.x.防止停止滚动视图在水平方向滚动.

- (void)scrollViewDidScroll:(UIScrollView *)sender {
    sender.contentOffset.x = 0.0
}
Run Code Online (Sandbox Code Playgroud)

停止垂直滚动:

如果要垂直滚动,则需要增加contentOffset.y.防止停止滚动视图在垂直方向滚动.

- (void)scrollViewDidScroll:(UIScrollView *)sender {
    sender.contentOffset.y = 0.0
}
Run Code Online (Sandbox Code Playgroud)

上面的代码可以防止a 和a中的更改,x并导致停止方法中的滚动.yscrollview contentOffsetscrollViewDidScroll:

  • 这有点像黑客攻击,但是当其他所有方法都失败时它就会起作用.所以+1,但仅作为最后的手段使用. (12认同)
  • 我也使用这个委托方法,但我用一个单行替换正文,例如:`scrollView.contentOffset = CGPointMake(0,scrollView.contentOffset.y);`禁用水平滚动.我发现它更具可读性,它更小,并且没有必要对零进行测试,因为几乎没有代码运行这种情况的开销(即每秒最多几十次). (4认同)
  • 更简单的是,在`scrollViewDidScroll()`委托函数中使用`scrollView.contentOffset.y = 0.0`来停止垂直滚动和`scrollView.contentOffset.x = 0.0`来停止水平滚动.但是,我相信确保`scrollView.contentSize`等于`scrollView.frame.size`是一个更好(正确)的解决方案.见@danbeaulieu答案. (2认同)

Mir*_*ner 10

自从iOS7使用

self.automaticallyAdjustsScrollViewInsets = NO;
Run Code Online (Sandbox Code Playgroud)

//并创建3页的页面滚动条

    self.pageView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)];
    [self.pageView setContentSize:CGSizeMake(self.view.frame.size.width*3, self.view.frame.size.height)];
    [self.pageView setShowsVerticalScrollIndicator:NO];
    [self.pageView setPagingEnabled:YES];
    [self.view addSubview:self.pageView];
Run Code Online (Sandbox Code Playgroud)


Dan*_*ieu 10

迅捷解决方案

创建两个出口,一个用于视图,另一个用于滚动视图:

@IBOutlet weak var myView: UIView!
@IBOutlet weak var scrollView: UIScrollView!
Run Code Online (Sandbox Code Playgroud)

然后在viewDidLayoutSubviews中添加以下代码:

let scrollSize = CGSize(width: myView.frame.size.width, 
                        height: myView.frame.size.height)
scrollView.contentSize = scrollSize
Run Code Online (Sandbox Code Playgroud)

我们所做的是收集视图的高度和宽度,并设置scrollViews内容大小以匹配它.这将阻止您的滚动视图水平滚动.


更多想法:

CGSizeMake使用CGFloats获取宽度和高度.您可能需要使用UIScrollViews现有高度作为第二个参数.看起来像这样:

let scrollSize = CGSize(width: myView.frame.size.width, 
                        height: scrollView.contentSize.height)
Run Code Online (Sandbox Code Playgroud)


Rin*_*cha 8

就我而言,使用Swift 4.2,您可以使用:

禁用垂直滚动:

func scrollViewDidScroll(_ scrollView: UIScrollView) {
    scrollView.contentOffset.y = 0.0
}
Run Code Online (Sandbox Code Playgroud)

禁用水平滚动:

func scrollViewDidScroll(_ scrollView: UIScrollView) {
    scrollView.contentOffset.x = 0.0
}
Run Code Online (Sandbox Code Playgroud)


Gul*_*han 6

在我的例子中,contentView 的宽度大于 UIScrollView 的宽度,这就是不需要的水平滚动的原因。我通过将 contentView 的宽度设置为等于 UIScrollView 的宽度来解决这个问题。

希望它可以帮助某人