【SwiftUI】Viewのフレームサイズ指定(frame)

(2022/03/26 更新)

Viewのフレームサイズを指定する方法を解説します。

スポンサーリンク

環境

この記事の情報は次のバージョンで動作確認しています。

【Xcode】13.3
【Swift】5.6
【iOS】15.4
【macOS】Monterey バージョン 12.3
スポンサーリンク

フレームの概要

フレームはレイアウトの基準となる枠で、デフォルトでは「Viewのサイズ=フレームのサイズ」ですが、frameモディファイアを使ってフレームサイズを変更できます。
具体的な例を示すと、下の図の青背景の部分がTextView、周りの赤枠がこのViewに設定されたフレームです。
VStackやHStackなどのレイアウトコンテナでは、このフレームを基準にViewの配置が行われます。

UntitledImage

スポンサーリンク

基本的な使い方

【引数】
※各引数は各々省略可能ですが、少なくとも1つ以上の指定が必要です。

width(省略可)
フレームの横幅をCGFloat型で設定します。省略した場合(=nil)、元のサイズから変わりません。

height(省略可)
フレームの高さをCGFloat型で設定します。省略した場合(=nil)、元のサイズから変わりません。

alignment(省略可)
フレーム内での元Viewの配置をAlignmentで指定します。

使用例

UntitledImage

スポンサーリンク

フレームサイズを可変にする

以下のイニシャライザをつかってフレームサイズに制約を設定すると、固定サイズではなく周りのViewに合わせてフレキシブルにサイズを調整できます。

【引数】
※各引数は各々省略可能ですが、少なくとも1つ以上の指定が必要です。また、矛盾が生じる制約(例:minWith > maxWidth)を指定した場合、実行エラーとなります。

minWidth(省略可)
フレームの最小幅をCGFloat型で指定します。
親Viewがより少ないスペースを指定しても、この幅を下回る事はありません。

maxWidth(省略可)
フレームの最大幅をCGFloat型で指定します。
親Viewがより広いスペースを提供しても、この幅を上回る事はありません。
逆に親Viewがこれより少ないスペースを指定した場合は、親の指定した範囲までとなります。

minHeight(省略可)
フレームの最小高をCGFloat型で指定します。
親Viewがより少ないスペースを指定しても、この高さを下回る事はありません。

maxHeight(省略可)
フレームの最大高をCGFloat型で指定します。
親Viewがより広いスペースを提供しても、この高さを上回る事はありません。
逆に親Viewがこれより少ないスペースを指定した場合は、親の指定した範囲までとなります。

alignment(省略可)
フレーム内での元Viewの配置をAlignmentで指定します。

使用例

親Viewのサイズに合わせて対象Viewのサイズは変わりますが、最小サイズと最大サイズは固定となっている例です。

UntitledImage

スポンサーリンク

フレームサイズを最大にする

maxWidth、maxHeightにCGFloat型の最大値を示すプロパティ.infinityを指定すると、他のViewに干渉しない最大サイズにできます。

次の例は、表示可能なセーフエリアいっぱいまでフレームサイズを広げた例です。

UntitledImage

フレームサイズをセーフエリア外まで広げる

フレームサイズをセーフエリア外まで広げるには、このモディファイアを追加します。

UntitledImage

.ignoresSafeArea() モディファイアの詳しい解説は【SwiftUI】Viewをセーフエリア外に拡張する(ignoresSafeArea)を参照してください。

スポンサーリンク

あわせて読みたい記事

【SwiftUI】Viewの配置指定(Alignment)
Viewの配置や整列の指定に使うプロパティについて解説します。
【SwiftUI】Viewをセーフエリア外に拡張する(ignoresSafeArea)
(2022/03/27 更新) Viewをセーフエリア外に拡張する .ignoresSafeArea() モディファイアについて解説します。 iOS14から使えるようになったモディファイアで、以前からあった .edgesIgnoringSa...