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