Программное создание стека 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)")
    }

}

person Shadowfacts    schedule 20.02.2018    source источник


Ответы (1)


Вам следует:

• Прикрепите нижнюю часть stackView к нижнему краю контента scrollView, обновив последнее ограничение VFL следующим образом:

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)
person Olivier    schedule 21.02.2018
comment
Я пинаю себя; что одна недостающая труба была всем, что было. - person Shadowfacts; 21.02.2018