在 SwiftUI 中以全屏模式呈现视图

SHA*_*AIN 6 ios swift swiftui

我需要在 SwiftUI 中以全屏模式呈现一个视图。

在 UIKit 中,以下代码足以呈现UIViewController全屏模态:

let modalViewController = ModalViewController()
modalViewController.modalPresentationStyle = .fullScreen
present(modalViewController, animated: true, completion: nil)
Run Code Online (Sandbox Code Playgroud)

在 SwiftUI 中,我们使用sheet来进行模态视图呈现:

struct ContentView: View {
    @State private var showingSheet = false
    
    var body: some View {
        Button("Show Sheet") {
            showingSheet.toggle()
        }
        .sheet(isPresented: $showingSheet) {
            SecondView(name: "Imran")
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

在没有全屏呈现的情况下,工作表像卡片一样呈现视图,可以通过下拉视图来将其关闭。

我需要以全屏方式呈现模式视图,以便不能通过下拉将其关闭。

我怎样才能像我在之前的 UIKit 代码中所做的那样,使这个工作表模式演示全屏显示?

SHA*_*AIN 13

在 swiftUI 中,有两种方式以全屏模式呈现视图

.fullScreenCover(isPresented:onDismiss:content:)

当我们需要显示单个视图时,我们需要使用这个特定的修饰符

struct ContentView: View {
    @State private var showingSheet = false
    
    var body: some View {
        Button("Show Sheet") {
            showingSheet.toggle()
        }
        .fullScreenCover(isPresented: $showingSheet) {
            SecondView(name: "Imran")
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

.fullScreenCover(item:onDismiss:content:)

当我们有一个项目列表并且需要在模式视图而不是导航视图中显示每个项目的详细信息时,我们需要使用此修饰符

示例代码

struct Person: Identifiable {
    var id = UUID()
    var name: String
}

struct PersonListView: View {
    let people = [
        Person(name: "Imran"),
        Person(name: "Anik"),
        Person(name: "Nayeem"),
        Person(name: "Linkon")
    ]
    
    @Environment(\.dismiss) var dismiss
    @State private var selectedPerson: Person?

    var body: some View {
        VStack {
            List(people) { person in
                Button(action: {
                    selectedPerson = person
                }) {
                    Text(person.name)
                }
            }
            
            Spacer()
            
            Button("Dismiss") {
                dismiss()
            }
        }
        .fullScreenCover(item: $selectedPerson) { person in
            PersonDetailView(person: person)
        }
    }
}

struct PersonDetailView: View {
    @Environment(\.dismiss) var dismiss
    let person: Person

    var body: some View {
        VStack {
            Spacer()
            Text(person.name)
                .font(.title)
            
            Spacer()
            
            Button("Dismiss") {
                dismiss()
            }
        }
        .padding()
    }
}

struct ContentView: View {
    var body: some View {
        PersonListView()
    }
}
Run Code Online (Sandbox Code Playgroud)


Vad*_*aev 5

使用.fullScreenCover(isPresented:onDismiss:content:).fullScreenCover(item:onDismiss:content:)修饰符:

struct ContentView: View {
    @State private var showingSheet = false
    
    var body: some View {
        Button("Show Sheet") {
            showingSheet.toggle()
        }
        .fullScreenCover(isPresented: $showingSheet) {
            SecondView(name: "Imran")
        }
    }
}
Run Code Online (Sandbox Code Playgroud)