色々認識が間違ってたっぽいので、きっちりメモしておく
Proxyには【GeometryReaderのサイズ】が入っている
一発目からの勘違いで、親viewのサイズが入ってると勘違いしていた。
当たり前だけど、入ってるのはGeometryReaderのサイズで、GeometryReaderのサイズは親viewに依存して決定されるものだから、一般論として親のviewのサイズと言いがち。
ところが、GeometryReader自体に.frameをつけてサイズを指定すれば、親のviewに関係なく、指定したサイズが入ることになる。
タイトルバー(ナビゲーションバー)などを除去したサイズとかも取れる
safeAreaInsetsに格納されている。
Sticky headerを作る時にナビゲーションバーのサイズが取れなくて苦戦した。
ところが、そもそもナビゲーションを除去した座標が取れれば、offsetでナビゲーションバーにぴたっと止められることは可能。
安全領域の要素
以下が安全領域以外に該当し、除去した内容がsafeAreaInsetsに入る。
1.ステータスバー
2.ノッチ(iPhone X以降のデバイス)
3.ナビゲーションバー
4.ホームインジケータ(iPhone X以降のデバイス)
5.ツールバー
6.タブバー
できることサンプル
geometry.safeAreaInsets.top
safeareaのトップの高さ
geometry.size.height
geometryの親の高さ
GeometryProxy のプロパティとメソッド
引数(Proxy)に格納されているプロパティとメソッドは以下のとおり
size
ビューのサイズを返す。
型: CGSize
指定方法:geometry.size.width、geometry.size.height
safeAreaInsets
ビューの各エッジに対する安全領域のインセット(距離)を返します。
型: EdgeInsets
指定方法:geometry.safeAreaInsets.top など
frame(in:)
【指定された座標空間におけるビューのフレーム(位置とサイズ)】を取得するために使用されます
.global
Geometry Readerの領域関係なく、【画面全体を対象】とした座標やサイズを取得する。
ディスプレイの左上が(0,0)になる。
ナビゲーションバーの下の表示されている領域の左上が(0,0)になるわけではない
.local
Geometry Reader自体を全体とし、Geometry Readerの領域の左上を(0,0)として取得。
ナビゲーションバーの下を(0,0)として取得したい場合は.localを使う。
.localを使い、全体を囲む親として指定すると、表示領域のみで(0,0)が取得できる
.named
【名前をつけた他のview】のサイズなどを取得するもの。
Geometry Readerの外にあるviewに名前をつけ、Geometry Readerの中で使える
.coordinateSpace(name: "hogename")
という感じで他のviewに名付けを行った上で使う