Swift - 以编程方式创建垂直UIScrollView

时间:2015-03-17 08:14:19

标签: ios swift uiscrollview

我一直在寻找一个(工作)教程的日子,甚至是一个使用UIScrollView垂直滚动的示例应用程序,这是编程的。有很多关于使用故事板的教程,让我不知所措。

我查看了苹果的文档,他们的“指南”仍然没有一个可靠的例子或提示从哪里开始。

到目前为止,我所做的是做了以下一些事情。

直接在班级

中将我的视图设为滚动视图
let scrollView = UIScrollView(frame: UIScreen.mainScreen().bounds)

然后将其分配给viewDidLoad函数中的视图

self.view = scollView

尝试更改内容大小。

self.scrollView.contentSize = CGSize(width:2000, height: 5678)

尝试使用

启用滚动
scrollView.scrollEnabled = true

以编程方式执行此操作时可以找到的最后一个建议

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
    scrollView.frame = view.bounds
}

目前我没有尝试开始将我的对象添加到scrollview,(我不需要缩放,只需要进行垂直滚动),但我没有设法得到任何工作:(事实上,正在运行这些添加的应用程序只会导致UIProblems,屏幕向上移动奇怪,它不适合我的屏幕的整个宽度?我尝试修复使框架边界等于宽度,但仍然无法正常工作

我没有收到任何错误。

我很想看到一个可以垂直滚动的示例viewcontroller!或任何帮助将非常感谢!

编辑了灾难的屏幕截图,试图让我的视图可滚动导致。

http://i.stack.imgur.com/gQ0SC.png

(链接而不是图像,由于缺少直接放置图像的点。)

(我将滚动视图背景设置为红色,看看它是否显示正确。看起来似乎是这样。但我无法在任何地方滚动

正如评论中所建议的那样,我没有使用self.view = self.scrollview,而是尝试将scrollview添加为self.view的子视图,但没有取得积极的结果。

编辑2:

添加

scrollView.contentSize = CGSize(width:2000, height: 5678)

to viewDidLayoutSubviews,如下面的评论中所建议的那样,我的视图可以滚动!

然而,由于某种原因,我的布局仍然看起来像一个完整的混乱(它看起来应该是,在我可以滚动之前)。

这是我的topBar(蓝色)的示例约束,它应该占用整个水平空间。

self.scrollView.addConstraints(
        NSLayoutConstraint.constraintsWithVisualFormat(
            "H:|[topBar]|", options: nil, metrics: nil, views: viewsDictionary))

为什么这不起作用的任何想法?

2 个答案:

答案 0 :(得分:8)

严格来说,我觉得问题就在下面。

self.view = scollView

应为self.view.addSubview(scollView)

然后在scrollview中添加所有标签,按钮等,然后给出内容大小。

内容大小是告诉scrollview滚动的参数。

self.scrollView.contentSize = CGSize(width:2000, height: 5678)放入viewDidLayoutSubviews

答案 1 :(得分:3)

Swift 4.2

我给出了使用自动布局滚动堆栈视图的简单完整示例。

所有视图都在代码中,不需要故事板。

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        view.addSubview(scrollView)
        scrollView.addSubview(scrollViewContainer)
        scrollViewContainer.addArrangedSubview(redView)
        scrollViewContainer.addArrangedSubview(blueView)
        scrollViewContainer.addArrangedSubview(greenView)

        scrollView.leadingAnchor.constraint(equalTo: view.leadingAnchor).isActive = true
        scrollView.trailingAnchor.constraint(equalTo: view.trailingAnchor).isActive = true
        scrollView.topAnchor.constraint(equalTo: view.topAnchor).isActive = true
        scrollView.bottomAnchor.constraint(equalTo: view.bottomAnchor).isActive = true

        scrollViewContainer.leadingAnchor.constraint(equalTo: scrollView.leadingAnchor).isActive = true
        scrollViewContainer.trailingAnchor.constraint(equalTo: scrollView.trailingAnchor).isActive = true
        scrollViewContainer.topAnchor.constraint(equalTo: scrollView.topAnchor).isActive = true
        scrollViewContainer.bottomAnchor.constraint(equalTo: scrollView.bottomAnchor).isActive = true
        // this is important for scrolling
        scrollViewContainer.widthAnchor.constraint(equalTo: scrollView.widthAnchor).isActive = true
    }

    let scrollView: UIScrollView = {
        let scrollView = UIScrollView()

        scrollView.translatesAutoresizingMaskIntoConstraints = false
        return scrollView
    }()

    let scrollViewContainer: UIStackView = {
        let view = UIStackView()

        view.axis = .vertical
        view.spacing = 10

        view.translatesAutoresizingMaskIntoConstraints = false
        return view
    }()

    let redView: UIView = {
        let view = UIView()
        view.heightAnchor.constraint(equalToConstant: 500).isActive = true
        view.backgroundColor = .red
        return view
    }()

    let blueView: UIView = {
        let view = UIView()
        view.heightAnchor.constraint(equalToConstant: 200).isActive = true
        view.backgroundColor = .blue
        return view
    }()

    let greenView: UIView = {
        let view = UIView()
        view.heightAnchor.constraint(equalToConstant: 1200).isActive = true
        view.backgroundColor = .green
        return view
    }()
}

希望获得帮助!