У меня следующая точка зрения:
struct Example: View {
var body: some View {
List{
Color.red
.listRowInsets(EdgeInsets())
Color.blue
.listRowInsets(EdgeInsets())
}
.listStyle(.grouped)
List{
Color.green
.listRowInsets(EdgeInsets())
Color.yellow
.listRowInsets(EdgeInsets())
}
.listStyle(.grouped)
.ignoresSafeArea()
}
}
который генерирует следующий макет:
Теперь я действительно хочу, чтобы синяя строка списка в первом списке была такой же ширины, как зеленая и желтая строки во втором списке (игнорируя безопасную область). Но я хочу оставить красный такой же широким, какой он есть сейчас (соблюдая безопасную зону). Как мне это сделать? Простое добавление .ignoresSafeArea()
в строку синего списка не даст никакого эффекта.
Модификатор .ignoresSafeArea()
работает только в том случае, если вид уже соприкасается с краем вставки безопасной области. В противном случае это не имеет никакого эффекта, что может иметь место для строк внутри List
.
Вы всегда можете сделать это по-другому и игнорировать вставки безопасной области для всего List
(как вы делаете во втором примере), а затем добавить отступы или вставки строк в строках, которые вы хотите сохранить внутри безопасной области. Символ GeometryReader
можно использовать для измерения размера вставок безопасной зоны:
var body: some View {
GeometryReader { proxy in
VStack {
List{
Color.red
.listRowInsets(EdgeInsets())
.padding(.leading, proxy.safeAreaInsets.leading)
.padding(.trailing, proxy.safeAreaInsets.trailing)
Color.blue
.listRowInsets(EdgeInsets())
}
.listStyle(.grouped)
.ignoresSafeArea(edges: .horizontal)
List{
Color.green
.listRowInsets(EdgeInsets())
Color.yellow
.listRowInsets(EdgeInsets())
}
.listStyle(.grouped)
.ignoresSafeArea()
}
}
}
Есть ли причина использовать отступы, когда вы можете просто использовать EdgeInsets, которые вы уже объявили? .listRowInsets(EdgeInsets(top: 0, leading: proxy.safeAreaInsets.leading, bottom: 0, trailing: proxy.safeAreaInsets.trailing))
@flanker Они оба работают, и фон в дополненной области также кажется одинаковым для обоих. Если все сделано с использованием вставок, то либо у вас будет одна длинная строка с 4 параметрами для EdgeInsets
, либо у вас будет больше строк кода с вложенными отступами. Поэтому я предпочел отступы для краткости и ясности.
Спасибо! Я тоже думал об этом подходе, но надеялся обойтись без GeometryReader.