Что с ограничениями в SwiftUI? - PullRequest
11 голосов
/ 05 июня 2019

Что происходит сейчас с ограничениями в SwiftUI? View типы адаптируются автоматически для больших устройств и т. Д. Или что мы должны сделать вместо этого?

Ответы [ 2 ]

15 голосов
/ 06 июня 2019

RIP, Ограничения!

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

Однако, если вы решитеперейти с SwiftUI → покойся с миром, ограничения!

Tomb Stone with

Основная концепция для совмещения видов друг с другом использует стеки:

Если вы хотите наложить виды (т.е. поместить один вид поверх другого), вы можете использовать

В самом протоколе View (, которому таинственно соответствуют все типы представлений ) имеется множество функций, называемых модификаторами , которые можно использовать длянастроить макет вашего представления.


Примеры

Вот несколько примеров того, как вы можете получить конкретные макеты с этими модификаторами по сравнению с использованием ограничений:

1.Соотношение сторон

Вместо

view.widthAnchor.constraint(equalTo: view.heightAnchor, multiplier: 2)

в UIKit вы бы написали

view
    .aspectRatio(2, contentMode: .fit)

в SwiftUI .

2.Интервал между представлениями

Вместо

view2.leadingAnchor.constraint(equalTo: view1.leadingAnchor, constant: 8)

в UIKit вы можете расположить представления в горизонтальном стеке, добавить пробел между ними и добавить модификатор frameуказать его ширину:

HStack {
    view1
    Spacer()
        .frame(width: 30)
    view2
}

3.Равные ширины

Здесь все становится сложнее.Вы больше не можете указывать, что два вида имеют одинаковую ширину.Если они находятся в одном вертикальном стеке (то есть выровнены по вертикальной линии), хорошо: просто установите contentMode в .fill и управляйте фактической шириной, устанавливая ширину стекового вида → задание выполнено.If Но если это не так (например, когда они находятся в горизонтальном стеке), вы должны найти другие способы выразить это.Реальная реализация будет зависеть от конкретной компоновки, которую вы пытаетесь описать.


Общая идея SwiftUI состоит в том, чтобы сохранять как можно меньшие размеры и составлять их.Здесь есть небольшой компромисс: вы платите цену за то, что «ограничения» между представлениями в разных иерархиях представлений становятся намного более многословными для реализации, в конечном итоге выгода заключается в том, что макет является декларативным, а код для создания наиболее распространенных пользовательских интерфейсов -резко упростил


Адаптация экрана / Отзывчивость

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

4 голосов
/ 05 июня 2019

У него все еще есть ограничение, в примерах WWDC мы видели HStack и VStack, что похоже на UIStackView, так что я думаю, это просто обрезает края. Вы по-прежнему можете добавлять отступы к представлениям, поэтому, если вы хотите ограничить UILabel (Текст) в 10pt слева, вы сделаете что-то вроде этого:

Text("Hello World").padding(EdgeInsets.init(top: 0, leading: 10, bottom: 0, trailing: 0))
...