ikeh1024のブログ

ZennやQiitaに書くにはちょっと小粒なネタをこちらに書いています

GeometryReaderをbackgroundで呼び出してビューのサイズを取得するのはバッドプラクティス

import SwiftUI

struct ContentView: View {
    
    @State private var realViewSize = CGSize(width: 200, height: 200)
    @State private var viewSize: CGSize = .zero
    
    var body: some View {
        VStack {
            HStack {
                Button("+") {
                    realViewSize.width += 10
                    realViewSize.height += 10
                }
                Button("-") {
                    realViewSize.width -= 10
                    realViewSize.height -= 10
                }
            }
            Text("\(realViewSize.debugDescription)")
            Text("\(viewSize.debugDescription)")
        }
        .frame(width: realViewSize.width, height: realViewSize.height)
        .background(.blue.opacity(0.3))
        .background() {
            viewSizeGettger()
        }
        .padding()
    }
    
    @ViewBuilder
    private func viewSizeGettger() -> some View {
        GeometryReader { geometry in
            Color.clear
                .onAppear {
                    viewSize = geometry.size
                }
        }
    }
}

#Preview {
    ContentView()
}

image