Высота представления контейнера UIStackView на основе подпредставлений - PullRequest
0 голосов
/ 29 января 2019

Вот мой простой пример.У меня есть 1 вертикальный вид стека с 1 подпредставлением.Я хочу, чтобы высота подпредставлений основывалась на внутренней высоте метки внутри нее, чтобы я мог поддерживать динамическую высоту для всего представления стека.Как это может быть сделано?Спасибо

enter image description here

Ответы [ 2 ]

0 голосов
/ 29 января 2019

Я думаю, вы все сделали правильно.Но вот ключи:

  1. Не устанавливать высоту для stackView.
  2. Установить верхнюю, нижнюю, левую, конечные ограничения для просмотра.
  3. Выполнить.На симуляторе все должно быть в порядке.

Если вы обнаружили, что высота надписи кажется не оборачиваемой (ни на раскадровке, ни на симуляторе), то измените Приоритет вертикального содержимого надписи на 750.

enter image description here

0 голосов
/ 29 января 2019

Попробуйте этот код:

class DyanmicTextLabelViewController: UIViewController {

    private var didAddConstraint = false

    private let label: UILabel = {
        let view = UILabel()
        view.translatesAutoresizingMaskIntoConstraints = false
        view.setContentHuggingPriority(.required, for: .vertical)
        view.setContentCompressionResistancePriority(.required, for: .vertical)
        view.text = "Layout anchors let you create constraints in an easy-to-read, compact format. They expose a number of methods for creating different types of constraints, as shown in Listing 13-1."
        view.numberOfLines = 0
        return view
    }()
    private lazy var container: UIView = {
        let view = UIView()
        view.translatesAutoresizingMaskIntoConstraints = false
        view.addSubview(label)
        view.backgroundColor = .red
        return view
    }()
    private lazy var stackview : UIStackView = {
        let view = UIStackView()
        view.translatesAutoresizingMaskIntoConstraints = false
        view.axis = .horizontal
        view.distribution = .fill
        view.addArrangedSubview(container)
        return view
    }()

    override func loadView() {
        super.loadView()

        view.addSubview(stackview)
        view.setNeedsUpdateConstraints()

        view.backgroundColor = .white
    }


    override func updateViewConstraints() {
        super.updateViewConstraints()

        if didAddConstraint == false {
            didAddConstraint = true

            // stackview constraints
            stackview.leftAnchor.constraint(equalTo: view.leftAnchor).isActive = true

            let topAnchor = stackview.topAnchor.constraint(equalTo: view.topAnchor)
            topAnchor.constant = 20
            topAnchor.isActive = true

            stackview.rightAnchor.constraint(equalTo: view.rightAnchor).isActive = true

            // label constraint
            // example for giving label a left padding
            let labelLeft = label.leftAnchor.constraint(equalTo: container.leftAnchor)
            labelLeft.constant = 16.0
            labelLeft.isActive = true

            label.topAnchor.constraint(equalTo: container.topAnchor).isActive = true
            label.rightAnchor.constraint(equalTo: container.rightAnchor).isActive = true
            label.bottomAnchor.constraint(equalTo: container.bottomAnchor).isActive = true
        }
    }
}

Важной частью здесь является инициализация stackview, label и ограничение, установленное на label

labelинициализация

private let label: UILabel = {
    let view = UILabel()
    view.translatesAutoresizingMaskIntoConstraints = false
    view.setContentHuggingPriority(.required, for: .vertical)
    view.setContentCompressionResistancePriority(.required, for: .vertical)
    view.text = "Layout anchors let you create constraints in an easy-to-read, compact format. They expose a number of methods for creating different types of constraints, as shown in Listing 13-1."
    view.numberOfLines = 0
    return view
}()

stackview инициализация

private lazy var stackview : UIStackView = {
    let view = UIStackView()
    view.translatesAutoresizingMaskIntoConstraints = false
    view.axis = .horizontal
    view.distribution = .fill
    view.addArrangedSubview(container)
    return view
}()

label ограничение

// label constraint
// example for giving label a left padding
let labelLeft = label.leftAnchor.constraint(equalTo: container.leftAnchor)
labelLeft.constant = 16.0
labelLeft.isActive = true

label.topAnchor.constraint(equalTo: container.topAnchor).isActive = true
label.rightAnchor.constraint(equalTo: container.rightAnchor).isActive = true
label.bottomAnchor.constraint(equalTo: container.bottomAnchor).isActive = true

Эти настройки могут быть легко переведены на раскадровку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...