Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 以编程方式创建UILabel堆栈_Ios_Swift_Uikit - Fatal编程技术网

Ios 以编程方式创建UILabel堆栈

Ios 以编程方式创建UILabel堆栈,ios,swift,uikit,Ios,Swift,Uikit,我在胡思乱想一个通过编程创建的滚动视图和堆栈视图的示例,我决定尝试并将UIButtons更改为UILabels。我将for循环中的代码替换为以下代码: let label = UILabel() label.text = "Label" stackView.addArrangedSubview(label) 但是,当我重新运行应用程序时,我发现无法再滚动滚动滚动视图。调试之后,我发现堆栈视图的框架的宽度和高度都为零,我认为这是问题的根源。我一直无法理解为什么堆栈视图没有宽度或高度,或者如何使滚

我在胡思乱想一个通过编程创建的滚动视图和堆栈视图的示例,我决定尝试并将UIButtons更改为UILabels。我将for循环中的代码替换为以下代码:

let label = UILabel()
label.text = "Label"
stackView.addArrangedSubview(label)
但是,当我重新运行应用程序时,我发现无法再滚动滚动滚动视图。调试之后,我发现堆栈视图的框架的宽度和高度都为零,我认为这是问题的根源。我一直无法理解为什么堆栈视图没有宽度或高度,或者如何使滚动视图再次滚动

这是完整视图控制器,我对其进行了修改,以将其编译为Swift 4,使用UILabel并打印帧大小:

import UIKit

class ViewController: UIViewController {

    var scrollView: UIScrollView!
    var stackView: UIStackView!

    override func viewDidLoad() {
        super.viewDidLoad()

        scrollView = UIScrollView()
        scrollView.translatesAutoresizingMaskIntoConstraints = false
        view.addSubview(scrollView)

        view.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "H:|[scrollView]|", options: .alignAllCenterX, metrics: nil, views: ["scrollView": scrollView]))
        view.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "V:|[scrollView]|", options: .alignAllCenterX, metrics: nil, views: ["scrollView": scrollView]))


        stackView = UIStackView()
        stackView.translatesAutoresizingMaskIntoConstraints = false
        stackView.axis = .vertical
        scrollView.addSubview(stackView)

        scrollView.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "H:|[stackView]|", options: NSLayoutFormatOptions.alignAllCenterX, metrics: nil, views: ["stackView": stackView]))
        scrollView.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "V:|[stackView]", options: NSLayoutFormatOptions.alignAllCenterX, metrics: nil, views: ["stackView": stackView]))

        for _ in 1 ..< 100 {
            let label = UILabel()
            label.text = "Label"
            label.sizeToFit()
            stackView.addArrangedSubview(label)

//            let vw = UIButton(type: UIButtonType.system)
//            vw.setTitle("Button", for: .normal)
//            stackView.addArrangedSubview(vw)
        }
    }

    override func viewDidLayoutSubviews() {
        super.viewDidLayoutSubviews()
        scrollView.contentSize = CGSize(width: stackView.frame.width, height: stackView.frame.height)
        print("stack view frame: \(stackView.frame)")
    }

}
你应该:

•通过更新上一个VFL约束,将stackView的底部固定到scrollView的内容底部边缘,如下所示:

scrollView.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "V:|[stackView]|", options: NSLayoutFormatOptions.alignAllCenterX, metrics: nil, views: ["stackView": stackView]))
•避免将自动布局与“手动”布局混合,并删除该行:

scrollView.contentSize = CGSize(width: stackView.frame.width, height: stackView.frame.height)

我踢自己;那根丢失的管子就是一切。