見出し画像

SwiftUIで子Viewのframeやsize, GeometryProxyを取得する

概要

基本的に細かいframeやサイズなどを親Viewが認知しなくてもサクサクUI構築できてしまうSwiftUIですが、複雑なアニメーションを再現したいときなど、時折子Viewのframeやサイズ情報が欲しくなることがあります。

そんなニーズに便利なextensionをご紹介します!

コード紹介

実装

extension View {
  func geometryReader(in coordinateSpace: CoordinateSpace = .global, _ action: @escaping (GeometryProxy) -> Void) -> some View {
    background {
      GeometryReader { gp in
        Color.clear.onChange(of: gp.frame(in: coordinateSpace), initial: true) { _ in
          action(gp)
        }
      }
    }
  }
}

※このextension内で使用しているonChangeは以前の記事で別途紹介したextensionメソッドを使用しています。

使用例

struct SampleView: View {
  @State private var text = ""
  
  var body: some View {
    Text(text)
      .geometryReader { gp in
        text = """
        frame: \(gp.frame(in: .global))
        
        size: \(gp.size)
        
        safeAreaInsets: \(gp.safeAreaInsets)
        """
      }
  }
}

#Preview {
  SampleView()
}

おわり

お読みいただきありがとうございます!
もしなにかのお役に立つことがございましたら、
♡を頂けますとすごく励みになります😊

この記事が気に入ったらサポートをしてみませんか?