【SwiftUI 3.0】sheet を手動で閉じれないようにするには?

sheet で表示した画面は下にスワイプすると閉じることができますが、仕様によっては閉じられると困る場合もあります。

そのような場合に、interactiveDismissDisabled プロパティを設定することで閉じる動作を制御することができます。

動作確認済環境

Mac OS Big Sur(11.6)

Xcode 13.0

iOS 15.0

iPhone 13 mini シミュレータ

【SwiftUI 3.0】sheet を手動で閉じれないようにするには?

サンプルコード1

sheet プロパティで表示する側の View に interactiveDismissDisabled をコールするだけです。

struct ContentView: View {
    @State private var isPresentedSheet = false
    var body: some View {
        Button(action: {
            isPresentedSheet = true
        }, label: {
            Text("Show SheetView")
        })
        .sheet(isPresented: $isPresentedSheet) {
            SheetView()
        }
    }
}

struct SheetView: View {
    var body: some View {
        Text("Sheet")
            .interactiveDismissDisabled()
    }
}

これだけで手動で閉じることを防ぐことができます。

サンプルコード2

interactiveDismissDisabled には Binding<Bool> 値の変数を引数に指定することができ、条件が整ったら手動で閉じれるように切り替えることができます。

struct SheetView: View {
    @State private var isDisabled = true
    var body: some View {
        VStack {
            Text("Sheet")
                .interactiveDismissDisabled(isDisabled)
            Button(action: {
                isDisabled = false
            }, label: {
                Text("タップするとロック解除")
            })
        }
    }
}

データの編集中は閉じれないようにしたり、予期しない動作で閉じてしまうことを防ぐなどの制御に使えるのではないかと思います。

以上