RIP, Ограничения!
SwiftUI не использует ограничения макета. UIKit все еще существует, он не устарел и не полностью функционален, поэтому, если вы продолжаете использовать классический подход, вы можете использовать столько ограничений, сколько пожелаете.
Однако, если вы решитеперейти с SwiftUI → покойся с миром, ограничения!
Основная концепция для совмещения видов друг с другом использует стеки:
Если вы хотите наложить виды (т.е. поместить один вид поверх другого), вы можете использовать
В самом протоколе 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 состоит в том, чтобы сохранять как можно меньшие размеры и составлять их.Здесь есть небольшой компромисс: вы платите цену за то, что «ограничения» между представлениями в разных иерархиях представлений становятся намного более многословными для реализации, в конечном итоге выгода заключается в том, что макет является декларативным, а код для создания наиболее распространенных пользовательских интерфейсов -резко упростил
Адаптация экрана / Отзывчивость
Пользовательские представления по умолчанию заполняют все доступное пространство, что означает, что самый верхний вид автоматически заполняет весь экран - независимо от фактического размера экрана.Вы можете использовать модификаторы , чтобы изменить это поведение.