Как обрабатывать безопасное пространство в SwiftUI, игнорируя его

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

Если я сделаю что-то вроде этого:

@main
struct SampleApp: App {
    var body: some Scene {
        WindowGroup {
            VStack {
                Text("Top of my view")
                Spacer()
            }
            .frame(maxWidth: .infinity, maxHeight: .infinity)
            .background(Color.yellow)
        }
    }
}

Это отобразит текст вверху содержимого под безопасной областью. Но только область содержимого желтого цвета. Безопасные зоны белые.

Поэтому я добавляю .edgesIgnoringSafeAreas(.all) под модификатором .background.

Теперь мой текст находится ниже метки (или вверху экрана под текстом строки состояния) и не виден.

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

Если я помещаю свой VStack внутрь GeometryReader, reader.safeAreaInsets.top будет равен нулю (0), когда верхняя безопасная область игнорируется.

Надеюсь, это достаточно ясный вопрос. Кто-нибудь сталкивался с этим и есть решение?


person P. Ent    schedule 15.10.2020    source источник
comment
@vacawama background будет ограничен шириной VStack, поэтому в этом случае может потребоваться frame.   -  person pawello2222    schedule 15.10.2020


Ответы (2)


Вам нужно применить модификатор edgesIgnoringSafeArea только к Color.yellow.

Возможное решение - использовать ZStack:

@main
struct SampleApp: App {
    var body: some Scene {
        WindowGroup {
            ZStack {
                Color.yellow
                    .edgesIgnoringSafeArea(.all)
                VStack {
                    Text("Top of my view")
                    Spacer()
                }
            }
        }
    }
}
person pawello2222    schedule 15.10.2020
comment
Работает. Мне никогда не приходило в голову сделать это таким образом. Спасибо. - person P. Ent; 16.10.2020
comment
@ P.Ent Пожалуйста :) Если вы считаете, что наши ответы помогли решить вашу проблему, вы можете принять один из них, чтобы другие знали, что ваша проблема решена. - person pawello2222; 16.10.2020

Один из способов исправить это - применить .edgesIgnoringSafeArea(.all) только к Color.yellow внутри .background():

@main
struct SampleApp: App {
    var body: some Scene {
        WindowGroup {
            VStack {
                Text("Top of my view")
                Spacer()
            }
            .frame(maxWidth: .infinity, maxHeight: .infinity)
            .background(Color.yellow.edgesIgnoringSafeArea(.all))
        }
    }
}
person vacawama    schedule 15.10.2020
comment
Это тоже работает. Никогда и не думал делать это таким образом. - person P. Ent; 16.10.2020