Наложение перед вкладкой SwiftUI

Я использую SwiftUI TabView и я хочу добавить свой bottomSheet() модификатор, который принимает представление и отображает его как стандартный sheet() модификатор, но не занимая весь экран.

Текущее поведение : мне удалось создать настраиваемый модификатор и показать лист, но лист появляется за нижней панелью вкладок (поскольку он отображается изнутри NavigationView).

Ожидаемое поведение: я ищу способ закрыть панель вкладок листом впереди.

Минимальный воспроизводимый пример

Вот пользовательский модификатор, который я создал.

      struct BottomSheet<SheetContent: View>: ViewModifier {
    
    let sheetContent: SheetContent
    
    @Binding var isPresented: Bool
    
    init(isPresented: Binding<Bool>, @ViewBuilder content: () -> SheetContent) {
        self.sheetContent = content()
        _isPresented = isPresented
    }
    
    func body(content: Content) -> some View {
        ZStack {
            content
            if isPresented {
                ZStack {
                    Color.black.opacity(0.1)
                    VStack {
                        Spacer()
                        sheetContent
                            .padding()
                            .frame(maxWidth: .infinity)
                            .background(
                                Rectangle()
                                    .foregroundColor(.white)
                            )
                    }
                }
            }
        }
    }
}

extension View {
    func bottomSheet<SheetContent: View>(isPresented: Binding<Bool>, @ViewBuilder content: @escaping () -> SheetContent) -> some View {
        self.modifier(BottomSheet(isPresented: isPresented, content: content))
    }
}

Вот как я это использую.

      struct ScheduleTab: View {
    
    @State private var showSheet = false
    
    var body: some View {
        NavigationView {
            Button("Open Sheet") {
                showSheet.toggle()
            }
        }
        .navigationTitle("Today")
        .navigationBarTitleDisplayMode(.inline)
        .bottomSheet(isPresented: $showSheet) {
            Text("Hello, World")
        }
    }
}

0 ответов

Другие вопросы по тегам