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

Mar*_*k L 6 uiscrollview ios swift

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

我查看了苹果的文档,他们的"指南"仍然没有一个坚实的例子或暗示从哪里开始.

我到目前为止所尝试的是做了以下一些事情.

让我的视图成为一个直接在课堂上的scrollview

let scrollView = UIScrollView(frame: UIScreen.mainScreen().bounds)
Run Code Online (Sandbox Code Playgroud)

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

self.view = scollView
Run Code Online (Sandbox Code Playgroud)

试图更改内容大小.

self.scrollView.contentSize = CGSize(width:2000, height: 5678)
Run Code Online (Sandbox Code Playgroud)

试图启用滚动

scrollView.scrollEnabled = true
Run Code Online (Sandbox Code Playgroud)

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

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
    scrollView.frame = view.bounds
}
Run Code Online (Sandbox Code Playgroud)

目前我没有尝试开始将我的对象添加到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)
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

Fah*_*kar 8

严格来说,我觉得问题在于线下.

self.view = scollView
Run Code Online (Sandbox Code Playgroud)

它应该是 self.view.addSubview(scollView)

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

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

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


小智 7

斯威夫特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
    }()
}
Run Code Online (Sandbox Code Playgroud)

希望对您有所帮助!