Разница между UIStackView и привязкой автоматического макета - PullRequest
0 голосов
/ 09 июля 2020

Я недавно узнал о UIStackView и пытаюсь asp понять разницу между применением Auto Layout индивидуально к каждому элементу пользовательского интерфейса самостоятельно и использованием представления стека.

Допустим, у вас есть 5 UILabels, и вы хотите их равномерно распределить. Я могу использовать что-то вроде Auto Layout Anchors:

var previous: UILabel?

for label in [label1, label2, label3, label4, label5] {
    label.heightAnchor.constraint(equalToConstant: 88).isActive = true
    
    if let previous = previous {
        label.topAnchor.constraint(equalTo: previous.bottomAnchor, constant: 10).isActive = true
    } else {
        label.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor, constant: 0).isActive = true
    }
    
    previous = label
}

или Visual Format Language:

let viewsDictionary = ["label1": label1, "label2": label2, "label3": label3, "label4": label4, "label5": label5]
view.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "V:|[label1(labelHeight@999)]-[label2(label1)]-[label3(label1)]-[label4(label1)]-[label5(label1)]-(>=10)-|", options:[], metrics: metrics, views: viewsDictionary))

или использовать представление стека и установить параметр распределения на equalSpacing вдоль основного оси.

Это грубые примеры, но правильно ли я понимаю, что вы можете почти все, что делает представление стека, с помощью якорей автоматического макета или языка визуального формата, но представление стека упрощает это?

Или есть исключительные преимущества использования представления стека, которые нельзя сделать с помощью Auto Layout Anchors или Visual Format Language?

Ответы [ 3 ]

1 голос
/ 09 июля 2020

Использование этих двух элементов необязательно. StackView упрощает реализацию элементов, которые изменяются (добавляются / удаляются). Как вы писали, StackView - это упрощение. С помощью ограничений вы можете получить тот же эффект, что и в StackView, но вам придется немного подустать.

1 голос
/ 09 июля 2020

Как и все элементы управления UI, UIStackView имеет собственное назначение и варианты использования, и, возможно, вы можете реализовать все, что он делает, но вы потратите много времени :). Например, UIStackView имеет 5 вариантов распределения, вертикальный и горизонтальный, может использоваться со всеми функциями автоматического макета для поддержки различных размеров экрана и т. Д. c ..

Кроме того, скорее всего, он лучше протестирован, чем собственный код, который вы бы написали. Чем меньше строк кода придется написать, тем лучше :)

1 голос
/ 09 июля 2020

Visual Format Language имеет множество ограничений. У меня сложилось впечатление (может быть, ошибочное), что Apple его больше даже не разрабатывает - это просто для обратной совместимости.

Для вашего примера простого макета вы правы. Вы можете сделать то же самое со своим l oop, как и со стеком.

Однако ... предположим, вы хотите, чтобы эти 5 меток были центрированы по вертикали на экране? Или внутри другой вид? Если они находятся в представлении стека, вы просто ограничиваете положение представления стека.

Или предположим, что во время выполнения вы хотите добавить больше меток (или других представлений) или вставить label-2A между label2 и label3? С вашими зацикленными ограничениями у вас есть проблема. С представлением стека, stack.insertArrangedSubview(label2A, at: 2) (индексы отсчитываются от нуля), и все готово.

Представления стека также имеют много других функций упорядочения, которые делают жизнь очень простой при разработке сложных пользовательских интерфейсов.

Выполните поиск по запросу UIStackView для некоторых примеров - или даже просто просмотрите здесь несколько сообщений с тегами uistackview ... Я думаю, вы очень быстро увидите преимущества.

...