SwiftUI sheet表示、GeometryReader使用、VStackのみの状態と同じにする→sheetのサイズが知りたい

目的

sheetのサイズが知りたい

単純にGeometryReaderを挿入すると、デザインが崩れる。
元のデザインを使用出来る方法、sheetのサイズをデザインに使用する方法を探る。

sheet表示元

import SwiftUI

struct ContentView: View {

    @State var showPopup: Bool = false
    var body: some View {
        VStack {
            Image(systemName: "globe")
                .imageScale(.large)
                .foregroundColor(.accentColor)
            Text("Hello, world!")
            Button(action: {
                self.showPopup.toggle()
            }, label: {
                Text("Popup")
            })
            .buttonStyle(.bordered)
        }
        .padding()
        .sheet(isPresented: self.$showPopup, content: {
            PopupView()
        })
    }
}

VStackのみ

struct PopupView: View {
    var body: some View {
        VStack {
            Text("PopupView")
                .font(.largeTitle)
            Image(systemName: "star.fill")
                .font(.largeTitle)
                .symbolRenderingMode(.multicolor)
        }
    }
}

GeometryReader + VStack

struct PopupView: View {
    var body: some View {
        GeometryReader { geometry in
            VStack {
                Text("PopupView")
                    .font(.largeTitle)
                Image(systemName: "star.fill")
                    .font(.largeTitle)
                    .symbolRenderingMode(.multicolor)
            }
        }
    }
}

GeometryReader + VStack alignment指定

struct PopupView: View {
    var body: some View {
        GeometryReader { geometry in
            VStack(alignment: .center) {
                Text("PopupView")
                    .font(.largeTitle)
                Image(systemName: "star.fill")
                    .font(.largeTitle)
                    .symbolRenderingMode(.multicolor)
            }
        }
    }
}

GeometryReader + VStack frame指定

struct PopupView: View {
    var body: some View {
        GeometryReader { geometry in
            VStack() {
                Text("PopupView")
                    .font(.largeTitle)
                Image(systemName: "star.fill")
                    .font(.largeTitle)
                    .symbolRenderingMode(.multicolor)
            }
            .frame(width: geometry.size.width, height: geometry.size.height)
        }
    }
}

SwiftSwiftUI

Posted by shi-n