Skip to content

Instantly share code, notes, and snippets.

@hasanalisiseci
Created December 23, 2023 11:02
Show Gist options
  • Save hasanalisiseci/dfc72fe9afd7d262f0e2b33802ad18cb to your computer and use it in GitHub Desktop.
Save hasanalisiseci/dfc72fe9afd7d262f0e2b33802ad18cb to your computer and use it in GitHub Desktop.
Half Sheet with UIKit for SwiftUI
//
// HalfSheetWithUIKitForSwiftUI.swift
// TestAppForNewThinks
//
// Created by Hasan Ali Şişeci on 23.12.2023.
//
import SwiftUI
extension View {
/// For bottom Sheet
func halfSheet<SheetView: View>(showSheet: Binding<Bool>, detents: [UISheetPresentationController.Detent] = [.large()], grabberPrefers: Bool = true, @ViewBuilder sheetView: @escaping () -> SheetView) -> some View {
return background {
HalfSheetHelper(showSheet: showSheet, detents: detents, grabberPrefers: grabberPrefers, sheetView: sheetView())
}
}
}
/// UIKit Integration...
struct HalfSheetHelper<SheetView: View>: UIViewControllerRepresentable {
@Binding var showSheet: Bool
var detents: [UISheetPresentationController.Detent]
var grabberPrefers: Bool
var sheetView: SheetView
let controller = UIViewController()
func makeUIViewController(context: Context) -> UIViewController {
controller.view.backgroundColor = .clear
return controller
}
func updateUIViewController(_ uiViewController: UIViewController, context:
Context)
{
if showSheet {
// presenting Modal View....
let sheetController = CustomHostingController(rootView: sheetView, customDetents: detents, grabberPrefers: grabberPrefers)
uiViewController.present(sheetController, animated: true) {
DispatchQueue.main.async {
self.showSheet.toggle()
}
}
}
}
}
// Custom UIHostingController for halfSheet....
class CustomHostingController<Content: View>: UIHostingController<Content> {
var customDetents: [UISheetPresentationController.Detent]
var grabberPrefers: Bool
init(rootView: Content, customDetents: [UISheetPresentationController.Detent], grabberPrefers: Bool) {
self.customDetents = customDetents
self.grabberPrefers = grabberPrefers
super.init(rootView: rootView)
}
@MainActor required dynamic init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
override func viewDidLoad() {
super.viewDidLoad()
// setting presentation controller properties...
if let presentationController = presentationController as? UISheetPresentationController {
presentationController.detents = customDetents
presentationController.prefersGrabberVisible = grabberPrefers
presentationController.preferredCornerRadius = 12
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment