CatHand Blog

アプリ開発やMac弄り

SwiftUIで全画面にしてviewがずれるとき

.edgesIgnoringSafeArea(.all) を使えない(使いたくない)Viewで 全画面表示したいときに↓のようにすると、

struct ContentView: View {
    
    var body: some View {
        ZStack() {
            Color.blue
            Text("Hello, World!")
        }
            .frame(width: UIScreen.main.bounds.width)
            .frame(height: UIScreen.main.bounds.height)
    }
}

↓のように上の方に少し隙間が開きます。

f:id:cathandnya:20200619141027p:plain

これは、元々↓のようなViewのサイズだけを全画面サイズにしているので、上下のSafeAreaの差の分だけずれている状態です。

f:id:cathandnya:20200619141346p:plain

解決するには上下のSafeAreaの差の分だけずらしてやればよいです。

struct ContentView: View {
    
    let safeAreaInsets: UIEdgeInsets = UIApplication.shared.windows.first?.safeAreaInsets ?? .zero

    var body: some View {
        ZStack() {
            Color.blue
            Text("Hello, World!")
        }
            .frame(width: UIScreen.main.bounds.width)
            .frame(height: UIScreen.main.bounds.height)
            .offset(y: (safeAreaInsets.bottom - safeAreaInsets.top) / 2)
    }
}

もちろん、.edgesIgnoringSafeArea(.all) を使うのが一番良いと思います。