2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【SwiftUI】ScrollView内でframeを指定せず、画面にあったサイズに調整する

Last updated at Posted at 2023-11-23

はじめに

iOS17で追加されたcontainerRelativeFrameを使用すれば実現できます。

目指すUI

今回の完成系のUIはこちらです。
simulator_screenshot_1DA64188-71A9-4F99-8A37-AFFD79AD1E89.png

何が問題か説明

縦に図形を並べようと以下のようなコードを書きます。

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)
                }
            }
        }
    }
}

しかし、このように縦に潰れてしまいます。高さを指定していないからです。
simulator_screenshot_4691ABB7-4C95-4C5D-A360-50939FFCA2D4.png

高さは画面サイズによって変えたいので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)
                    }
                }
            }
        }
    }
}

こうすることで目指していたUIにする事ができます。
simulator_screenshot_38B337D6-22D6-4B66-8B02-906E4D28E638.png

しかし、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)
                }
            }
        }
    }
}

おわり

公式ドキュメントが結構詳しく書いてあるので見てみてください

公式ドキュメント

2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?