从编程上创建一堆uilabels



我正在处理这个编程创建的滚动视图和堆栈视图的示例,我决定尝试并将Uibuttons更改为Uilabels。我用此代码替换了for循环内部的代码:

let label = UILabel()
label.text = "Label"
stackView.addArrangedSubview(label)

当我重新运行应用程序时,我发现滚动视图不再可以滚动。调试后,我发现堆栈视图的frame的宽度为零,高度为零,我认为这是问题的根源。我一直无法弄清楚为什么堆栈视图没有宽度或高度或如何使滚动视图再次滚动。

这是完整的视图控制器,我的修改将其编译为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]))

•避免将AutoLayout与"手动"布局混合并删除该行:

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

最新更新