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

后端 未结 1 1569
长发绾君心
长发绾君心 2021-01-23 07:36

Currently we get a free opaque white/black background for swiftUI modal. Is there anyway to remove the free opaque color and make the modal view transparent?

In the ima

1条回答
  •  生来不讨喜
    2021-01-23 08:12

    based on this code snippet you can create viewcontroller extension and modify your presentation. 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(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:

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

    0 讨论(0)
提交回复
热议问题