🗾

【SwiftUI】Sheet下のViewの操作を有効にする

2024/03/07に公開

はじめに

MapKitを使ったアプリを開発中で、検索バーをSheetを使って常設しようとしました。
そのときにちょっと困ったことがありました。

困ったこと

Mapの上にSheetを表示すると、Mapの操作ができなくなりました。

サンプルコード

import SwiftUI
import MapKit

struct ContentView: View {
    @State private var showSheet: Bool = true
    @State private var inputText:String = ""
    
    var body: some View {
        ZStack {
            Map()
        }
        .sheet(isPresented: $showSheet) {
            HStack(spacing: 15){
                
                Image(systemName: "magnifyingglass")
                    .font(.system(size: 22))
                    .foregroundColor(.gray)
                
                TextField("場所を入力して移動", text: $inputText)
            }
            .presentationDetents([.height(60)])
            .presentationCornerRadius(20)
            .presentationBackground(.thinMaterial)
            .padding()
        }
    }
}

#Preview {
    ContentView()
}

解決法

presentationBackgroundInteractionモディファイアで、シート下にあるViewの操作をできるようしました。
https://developer.apple.com/documentation/swiftui/presentationbackgroundinteraction

import SwiftUI
import MapKit

struct ContentView: View {
    @State private var showSheet: Bool = true
    @State private var inputText:String = ""
    
    var body: some View {
        ZStack {
            Map()
        }
        .sheet(isPresented: $showSheet) {
            HStack(spacing: 15){
                
                Image(systemName: "magnifyingglass")
                    .font(.system(size: 22))
                    .foregroundColor(.gray)
                
                TextField("場所を入力して移動", text: $inputText)
            }
            .presentationDetents([.height(60)])
            .presentationCornerRadius(20)
            .presentationBackground(.thinMaterial)
            .presentationBackgroundInteraction(.enabled(upThrough: .height(60))) // これを追加
            .interactiveDismissDisabled()
            .padding()
        }
    }
}

#Preview {
    ContentView()
}

Discussion