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()
}
おわり
お読みいただきありがとうございます!
もしなにかのお役に立つことがございましたら、
♡を頂けますとすごく励みになります😊
この記事が気に入ったらサポートをしてみませんか?