Что с Ограничениями в SwiftUI? - программирование
Подтвердить что ты не робот

Что с Ограничениями в SwiftUI?

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

4b9b3361

Ответ 1

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

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

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

Tomb Stone with "RIP Constraints" inscription

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

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

Сам протокол 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 состоит в том, чтобы сохранять как можно меньшие размеры и составлять их. Здесь есть небольшой компромисс: вы платите цену за то, что "ограничения" между представлениями в разных иерархиях представлений становятся намного более многословными для реализации, в конечном итоге выгода заключается в том, что макет является декларативным, а код для создания наиболее распространенных пользовательских интерфейсов - резко упростил


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

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

Ответ 2

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

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