So zeigen Sie ein Modal an (iOS 13-Stil)
Sie brauchen nur eine einfache sheet
mit der Fähigkeit, sich selbst zu entlassen:
struct ModalView: View {
@Binding var presentedAsModal: Bool
var body: some View {
Button("dismiss") { self.presentedAsModal = false }
}
}
Und präsentieren Sie es wie:
struct ContentView: View {
@State var presentingModal = false
var body: some View {
Button("Present") { self.presentingModal = true }
.sheet(isPresented: $presentingModal) { ModalView(presentedAsModal: self.$presentingModal) }
}
}
Beachten Sie, dass ich das presentingModal
an das Modal übergeben habe, damit Sie es aus dem Modal selbst entfernen können, aber Sie können es loswerden.
Um es WIRKLICH präsent zu machen fullscreen
(nicht nur optisch)
Sie müssen auf die zugreifen ViewController
. Sie benötigen also einige Hilfsbehälter und Umgebungsmaterial:
struct ViewControllerHolder {
weak var value: UIViewController?
}
struct ViewControllerKey: EnvironmentKey {
static var defaultValue: ViewControllerHolder {
return ViewControllerHolder(value: UIApplication.shared.windows.first?.rootViewController)
}
}
extension EnvironmentValues {
var viewController: UIViewController? {
get { return self[ViewControllerKey.self].value }
set { self[ViewControllerKey.self].value = newValue }
}
}
Dann sollten Sie diese Erweiterung implementieren:
extension UIViewController {
func present<Content: View>(style: UIModalPresentationStyle = .automatic, @ViewBuilder builder: () -> Content) {
let toPresent = UIHostingController(rootView: AnyView(EmptyView()))
toPresent.modalPresentationStyle = style
toPresent.rootView = AnyView(
builder()
.environment(\.viewController, toPresent)
)
self.present(toPresent, animated: true, completion: nil)
}
}
Schließlich
Sie können es fullscreen
wie folgt machen :
struct ContentView: View {
@Environment(\.viewController) private var viewControllerHolder: UIViewController?
var body: some View {
Button("Login") {
self.viewControllerHolder?.present(style: .fullScreen) {
Text("Main") // Or any other view you like
}
}
}
}
UIKit
. Hast du einen besonderen Grund?