UIScrollView 不能水平滚动

Posted

技术标签:

【中文标题】UIScrollView 不能水平滚动【英文标题】:UIScrollView cannot scroll horizontally 【发布时间】:2017-03-08 14:10:52 【问题描述】:

我在 UIViewController 中有一个 UIScrollView,我希望它可以水平滚动。我通过循环以编程方式将按钮添加到 ScrollView。在循环之后,我将myScrollView.contentSize.width 设置为buttonWidth * numberOfButtons。我还仔细检查以确保 contentSize 大于滚动视图的框架(在这种情况下,滚动视图的宽度为 375)。

let numberOfButton = 7        
for index in 0..<numberOfButton 
    let button = UIButton()
    let frame = CGRect(x: 80 + (index * 80), y: 6, width: 60, height: 32)
    button.setTitle("Button" + String(index), forState: .Normal)
    button.frame = frame
    button.titleLabel?.font = UIFont(name: "Museo Sans", size: 16)
    button.setTitleColor(UIColor.blueColor(), forState: .Normal) 

    myScrollView.addSubview(button)

myScrollView.contentSize = CGSize(width: 100*numberOfButtons, height: 42)

当我运行代码时,它只出现在 Button3(有 7 个按钮)上,我无法滚动到最后。但是,当我设置myScrollView.bounces = true 时,我可以拖动滚动视图并查看其他按钮,但它会弹回原始状态。任何帮助将不胜感激。

【问题讨论】:

IMO 你应该使用collectionview 代替吗?另外,在此之后 myScrollView.contentSize 的值是多少。能打印出来看看吗 myScrollView.frame (0.0, 60.0, 375.0, 42.0) / myScrollView.contentSize (700.0, 42.0) 内容似乎还可以,我唯一能想到的可能是启用滚动。添加 myScrollView.isScrollEnabled = true 嗯,实际上它可以滚动,但只是很小。即使我还有 3 或 4 个按钮,我也无法滚动到它们。 啊,好吧,让我直说吧,你想正确显示 6 个按钮。当您前进时 【参考方案1】:

我认为您的问题是在第一个按钮上设置 X 值。我刚刚尝试了这段代码,它工作正常

    let numberOfButtons = 7
    for index in 0..<numberOfButtons 
        let button = UIButton()
        let frame = CGRect(x: 8 + (index * 96), y: 6, width: 80, height: 32)
        button.setTitle("Button \(index)", for: .normal)
        button.frame = frame
        button.titleLabel?.font = UIFont(name: "Museo Sans", size: 16)
        button.setTitleColor(UIColor.blue, for: .normal)

        myScrollView.addSubview(button)
    
    myScrollView.contentSize = CGSize(width: 100*numberOfButton, height: 42)

【讨论】:

我已经解决了这个问题。发生这种情况是因为我在 XIB 中有一个默认按钮(只是第一个按钮,其他按钮是动态创建的),并且它对父视图有约束,这就是为什么我不能滚动出第一个按钮的原因。我已阅读您的评论和解决方案。尽管他们没有回答问题,但他们给了我解决这个问题的线索。非常感谢。 啊,我会尽量避免同时拥有静态和动态视图。它可能会变得非常混乱。【参考方案2】:

改变这个

tagBar.contentSize = CGSize(width: 100*7, height: 42)

myScrollView.contentSize = CGSize(width: 100*7, height: 42)

【讨论】:

其实只是打字错误。我刚刚编辑了我的代码。问题依旧【参考方案3】:

Rajeshkumar R 给你的答案,或者更好的使用约束。您可以在myScrollView 的左侧和第一个按钮的左侧设置一个约束(“前导空格”约束),然后在每个按钮和前一个按钮之间设置一个前导空格约束,当你完成循环时,一个尾随空格你最后一个按钮到myScrollView

这样您就不必自己计算 contentSize。它也更具可扩展性(例如,如果您有不同大小的按钮,则必须知道每个宽度,将它们全部相加,然后将元素之间的边距以及第一个和最后一个与 scrollView 之间的边距相加......)。

【讨论】:

以上是关于UIScrollView 不能水平滚动的主要内容,如果未能解决你的问题,请参考以下文章

UIScrollview不会水平滚动

用于水平滚动的 UIScrollView 内的 UITableView 无法按预期工作

自动滚动 UIScrollView 以适应原生 iOS Mail.app 中的内容

水平 UIScrollView 中的多个垂直滚动 UIScrollView

使用按钮检测水平滚动 UIScrollView 上的垂直滚动

水平 UIScrollView 内部有垂直 UIScrollViews - 滚动外部水平视图时如何防止滚动内部滚动视图?