Forked from hasanalisiseci/HalfSheetWithUIKitForSwiftUI.swift
Created
May 8, 2024 03:19
-
-
Save advienncurtiz/908b6657a846f1a83c13f1a115081679 to your computer and use it in GitHub Desktop.
Half Sheet with UIKit for SwiftUI
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// | |
// 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