色々認識が間違ってたっぽいので、きっちりメモしておく

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に名付けを行った上で使う

同じカテゴリの記事

コメント