(2022/03/26 更新)
Viewのフレームサイズを指定する方法を解説します。
環境
この記事の情報は次のバージョンで動作確認しています。
【Swift】5.6
【iOS】15.4
【macOS】Monterey バージョン 12.3
フレームの概要
フレームはレイアウトの基準となる枠で、デフォルトでは「Viewのサイズ=フレームのサイズ」ですが、frameモディファイアを使ってフレームサイズを変更できます。
具体的な例を示すと、下の図の青背景の部分がTextView、周りの赤枠がこのViewに設定されたフレームです。
VStackやHStackなどのレイアウトコンテナでは、このフレームを基準にViewの配置が行われます。
1 2 3 4 5 6 7 8 9 10 11 |
struct ContentView: View { var body: some View { Text("カピ通信") .font(.largeTitle) .background(Color.blue) .frame(width: 200, height: 100) // フレームの設定 .border(Color.red, width: 2) // フレームに枠線を付けて可視化 } } |
基本的な使い方
1 2 3 |
.frame(width: CGFloat, height: CGFloat, alignment: Alignment) |
【引数】
※各引数は各々省略可能ですが、少なくとも1つ以上の指定が必要です。
width(省略可)
フレームの横幅をCGFloat型で設定します。省略した場合(=nil)、元のサイズから変わりません。
height(省略可)
フレームの高さをCGFloat型で設定します。省略した場合(=nil)、元のサイズから変わりません。
alignment(省略可)
フレーム内での元Viewの配置をAlignmentで指定します。
使用例
1 2 3 4 5 6 7 8 9 10 11 |
struct ContentView: View { var body: some View { Text("カピ通信") .font(.largeTitle) .background(Color.blue) // Text Viewの背景を青に .frame(width: 200, height: 100, alignment: .bottomTrailing) // フレームの設定 .border(Color.red, width: 2) // フレームに枠線を付けて可視化 } } |
フレームサイズを可変にする
以下のイニシャライザをつかってフレームサイズに制約を設定すると、固定サイズではなく周りのViewに合わせてフレキシブルにサイズを調整できます。
1 2 3 |
.frame(minWidth: CGFloat, maxWidth: CGFloat, minHeight: CGFloat, maxHeight: CGFloat, alignment: Alignment) |
【引数】
※各引数は各々省略可能ですが、少なくとも1つ以上の指定が必要です。また、矛盾が生じる制約(例:minWith > maxWidth)を指定した場合、実行エラーとなります。
minWidth(省略可)
フレームの最小幅をCGFloat型で指定します。
親Viewがより少ないスペースを指定しても、この幅を下回る事はありません。
maxWidth(省略可)
フレームの最大幅をCGFloat型で指定します。
親Viewがより広いスペースを提供しても、この幅を上回る事はありません。
逆に親Viewがこれより少ないスペースを指定した場合は、親の指定した範囲までとなります。
minHeight(省略可)
フレームの最小高をCGFloat型で指定します。
親Viewがより少ないスペースを指定しても、この高さを下回る事はありません。
maxHeight(省略可)
フレームの最大高をCGFloat型で指定します。
親Viewがより広いスペースを提供しても、この高さを上回る事はありません。
逆に親Viewがこれより少ないスペースを指定した場合は、親の指定した範囲までとなります。
alignment(省略可)
フレーム内での元Viewの配置をAlignmentで指定します。
使用例
親Viewのサイズに合わせて対象Viewのサイズは変わりますが、最小サイズと最大サイズは固定となっている例です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
struct ContentView: View { @State private var parentWidth: CGFloat = 600 @State private var parentHeight: CGFloat = 200 var body: some View { ZStack { VStack { Text("カピ通信") .font(.largeTitle) .frame(minWidth: 200, maxWidth: 500, minHeight: 50, maxHeight: 100) .background(Color.green) } .frame(width: parentWidth, height: parentHeight) .border(Color.red, width: 2) HStack { VStack { Spacer() Text("横幅:\(parentWidth, specifier: "%.0f")") Slider(value: $parentWidth, in: 0...600) } .padding() VStack { Spacer() Text("高さ:\(parentHeight, specifier: "%.0f")") Slider(value: $parentHeight, in: 0...200) } .padding() } } } } |
フレームサイズを最大にする
maxWidth、maxHeightにCGFloat型の最大値を示すプロパティ.infinityを指定すると、他のViewに干渉しない最大サイズにできます。
1 2 3 |
.frame(maxWidth: .infinity, maxHeight: .infinity) |
次の例は、表示可能なセーフエリアいっぱいまでフレームサイズを広げた例です。
1 2 3 4 5 6 7 8 9 |
struct ContentView: View { var body: some View { Rectangle() .fill(Color.orange) .frame(maxWidth: .infinity, maxHeight: .infinity) // フレームを最大サイズに設定 } } |
フレームサイズをセーフエリア外まで広げる
1 2 3 |
.ignoresSafeArea() |
フレームサイズをセーフエリア外まで広げるには、このモディファイアを追加します。
1 2 3 4 5 6 7 8 9 10 |
struct ContentView: View { var body: some View { Rectangle() .fill(Color.orange) .frame(maxWidth: .infinity, maxHeight: .infinity) .ignoresSafeArea() // セーフエリア外にViewを拡大する } } |
.ignoresSafeArea() モディファイアの詳しい解説は【SwiftUI】Viewをセーフエリア外に拡張する(ignoresSafeArea)を参照してください。