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

4

目前,我们在SwiftUI模态视图中可以获得一个免费的不透明白/黑色背景。是否有方法可以删除免费的不透明颜色并使模态视图透明?

如下图所示,最终结果应该能够看到图像,即使模态视图已经呈现。

enter image description here

1个回答

7

基于这个代码片段,您可以创建viewcontroller扩展并修改您的演示。

这是修改后的代码:
 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)
    }
}

您的 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!")
            }
        }
    }
}

惊人的解决方案!谢谢,这正是我需要的。我在UIKit视图上实现了它并以模态方式呈现,可以确认它在那里也能正常工作。 - Legolas Wang
1
这对我似乎不起作用。iOS 14 beta 6。代码已经复制完全相同。它呈现模态,但是背景是白色的,而不是透明的。 - Stewart Lynch

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接