简体   繁体   English

如何忽略 SwiftUI 模态背景,或使模态背景清晰/透明?

[英]How to ignore SwiftUI modal background, or make modal background clear/transparent?

Currently we get a free opaque white/black background for swiftUI modal.目前,我们为 swiftUI 模式获得了一个免费的不透明白色/黑色背景。 Is there anyway to remove the free opaque color and make the modal view transparent?无论如何要删除自由的不透明颜色并使模态视图透明?

In the image below, the end result should be able to see the image even with modal presented.在下图中,即使呈现模态,最终结果也应该能够看到图像。

在此处输入图片说明

based on this code snippet you can create viewcontroller extension and modify your presentation.基于此代码片段,您可以创建viewcontroller扩展并修改您的演示文稿。 here is modified code:这是修改后的代码:

 struct ViewControllerHolder {
    weak var value: UIViewController?
    init(_ value: UIViewController?) {
        self.value = value
    }
}

struct ViewControllerKey: EnvironmentKey {
    static var defaultValue: ViewControllerHolder { return ViewControllerHolder(UIApplication.shared.windows.first?.rootViewController ) }
}

extension EnvironmentValues {
    var viewController: ViewControllerHolder {
        get { return self[ViewControllerKey.self] }
        set { self[ViewControllerKey.self] = newValue }
    }
}

extension UIViewController {
    func present<Content: View>(presentationStyle: UIModalPresentationStyle = .automatic, transitionStyle: UIModalTransitionStyle = .coverVertical, animated: Bool = true, completion: @escaping () -> Void = {}, @ViewBuilder builder: () -> Content) {
        let toPresent = UIHostingController(rootView: AnyView(EmptyView()))
        toPresent.modalPresentationStyle = presentationStyle
        toPresent.rootView = AnyView(
            builder()
                .environment(\.viewController, ViewControllerHolder(toPresent))
        )

        toPresent.view.backgroundColor = .clear // This line is modified
        self.present(toPresent, animated: animated, completion: completion)
    }
}

Your SwiftUI ContentView:您的 SwiftUI 内容视图:

struct ContentView: View {

    @Environment(\.viewController) private var viewControllerHolder: ViewControllerHolder
    private var viewController: UIViewController? {
        self.viewControllerHolder.value
    }

    var body: some View {
        ZStack {
            Color.red
            Button(action: {
                self.viewController?.present(builder: {
                    Text("OK")
                })
            }) {
               Text("Present me!")
            }
        }
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM