Bir model göstermek için (iOS 13 stili)
Sadece sheetkendini kovma yeteneğine sahip bir basitliğe ihtiyacınız var :
struct ModalView: View {
@Binding var presentedAsModal: Bool
var body: some View {
Button("dismiss") { self.presentedAsModal = false }
}
}
Ve şu şekilde sunun:
struct ContentView: View {
@State var presentingModal = false
var body: some View {
Button("Present") { self.presentingModal = true }
.sheet(isPresented: $presentingModal) { ModalView(presentedAsModal: self.$presentingModal) }
}
}
Modalın kendisine geçtiğimi unutmayın,presentingModal böylece modalın kendisinden çıkarabilirsiniz, ancak ondan kurtulabilirsiniz.
GERÇEKTEN sunmak için fullscreen(Sadece görsel olarak değil)
Adresine erişmeniz gerekiyor ViewController. Yani bazı yardımcı konteynerlere ve çevre malzemelerine ihtiyacınız var:
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 }
}
}
O zaman bu uzantıyı uygulamak gerekir:
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)
}
}
En sonunda
şöyle yapabilirsiniz fullscreen:
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. Özel bir sebebin var mı?