モーダルビューに.sheetという以下のようなビューがあります。このビューをカスタマイズする方法を紹介します。

sheetの高さを設定する方法
sheetの高さを2段階に設定
まずは、presentationCompactAdaptationの基本的な使い方でシートの高さを2段階で設定してみます。
シートの高さはドラッグすると変更することが出来ます。
高さの指定の方法
高さは以下の方法で指定することができます。
3段階以上の高さを指定してみる
次は3段階以上の高さを指定してみます。指定方法においては、上記の指定方法をそれぞれ使用しています。
import SwiftUI
struct presentationDetentsSmp: View {
@State private var showingModal = false
var body: some View {
// モーダルビューの表示ボタン
Button("Show Modal") {
showingModal = true
}
.sheet(isPresented: $showingModal) {
// モーダルに表示するビュー
Text("This is a modal view.")
// 背景が分かりやすいように配色を変更
.foregroundStyle(.white)
.presentationBackground(.blue)
// sheetの高さを2段階に指定
.presentationDetents([
// structで独自に高さを定義
.custom(BarDetent.self),
// 数値で高さを指定
.height(300),
// 割合で高さを指定
.fraction(0.75),
// largeサイズを指定
.large
])
}
}
}
private struct BarDetent: CustomPresentationDetent {
static func height(in context: Context) -> CGFloat? {
context.maxDetentValue * 0.1
}
}高さをプログラム中で取得するには?
sheetの高さを指定する方法を紹介しましたが、現在設定されている高さを取得する方法もあります。
presentationDetentsのselectionパラメータを指定することで取得できます。
import SwiftUI
struct presentationDetentsSmp: View {
@State private var showingModal = false
@State private var settingsDetent = PresentationDetent.medium
var body: some View {
// モーダルビューの表示ボタン
Button("Show Modal") {
showingModal = true
}
.sheet(isPresented: $showingModal) {
// モーダルに表示するビュー
Text("This is a modal view.")
// 背景が分かりやすいように配色を変更
.foregroundStyle(.white)
.presentationBackground(.blue)
// sheetの高さを2段階に指定
.presentationDetents([
// structで独自に高さを定義
.custom(BarDetent.self),
// 数値で高さを指定
.height(300),
// 割合で高さを指定
.fraction(0.75),
// largeサイズを指定
.large],
selection: $settingsDetent)
if settingsDetent == .custom(BarDetent.self) {
Text("bar")
}
else if settingsDetent == .height(300) {
Text("small")
}
else if settingsDetent == .fraction(0.75) {
Text("extraLarge")
}
else {
Text("large")
}
}
}
}取得したサイズの表示
取得したサイズをそれぞれTextで表示してみました。



まとめ
この記事ではsheetのカスタマイズ方法として以下を紹介しました。
- シートの高さを指定する方法
- シートの高さを取得する方法
頻繁に使用する機能ではないかもしれませんが、シートの高さを変えて後ろのビューを一部見えるようにしておきたい場合などに活用できます。

