如何忽略SwiftUI中的安全区域空间

时间:2020-10-15 20:19:06

标签: swiftui safearealayoutguide

我希望完全为我的应用程序背景上色,同时将内容放在顶部,以使其与状态栏和具有该功能的设备上的顶部位置相距足够远。

如果我做这样的事情:

@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)。

我希望这是一个足够清楚的问题。有没有人遇到这个问题并有解决方案?

2 个答案:

答案 0 :(得分:1)

您只需将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()
                }
            }
        }
    }
}

答案 1 :(得分:1)

一种解决方法是将.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))
        }
    }
}