はじめに
iOS17で追加されたcontainerRelativeFrame
を使用すれば実現できます。
目指すUI
何が問題か説明
縦に図形を並べようと以下のようなコードを書きます。
import SwiftUI
struct ContentView: View {
var body: some View {
ScrollView(.vertical) {
VStack(spacing: 16) {
ForEach(0..<50, id: \.self) { _ in
RoundedRectangle(cornerRadius: 10)
.padding(10)
}
}
}
}
}
しかし、このように縦に潰れてしまいます。高さを指定していないからです。
高さは画面サイズによって変えたいのでGeometryReader
を使って画面サイズを高さに指定することになります。
import SwiftUI
struct ContentView: View {
var body: some View {
GeometryReader { geometryProxy in
ScrollView(.vertical) {
VStack(spacing: 16) {
ForEach(0..<50, id: \.self) { _ in
RoundedRectangle(cornerRadius: 10)
.padding(10)
.frame(height: geometryProxy.size.height)
}
}
}
}
}
}
しかし、GeometryReader
を使うのちょっとやだなということで、
iOS17で追加されたcontainerRelativeFrame
を使うことでGeometryReader
を消す事ができます。
実装
containerRelativeFrame
は親コンテナのサイズを使ってサイズ調整をしてくれるようです。
import SwiftUI
struct ContentView: View {
var body: some View {
ScrollView(.vertical) {
VStack(spacing: 16) {
ForEach(0..<50, id: \.self) { _ in
RoundedRectangle(cornerRadius: 10)
.padding(10)
+ .containerRelativeFrame(.vertical)
}
}
}
}
}
おわり
公式ドキュメントが結構詳しく書いてあるので見てみてください
公式ドキュメント