JJ_iOS/JJUNGTABLE/Common/CustomView/HalfView.swift
2024-06-26 12:38:42 +09:00

98 lines
3.0 KiB
Swift

//
// HalfView.swift
// PersonalHealthDiary
//
// Created by Sean Kim on 3/6/24.
//
import SwiftUI
//struct HalfView: View {
// @State var showSheet: Bool = false
//
// var body: some View {
//// NavigationView {
// Button {
// showSheet.toggle()
// } label: {
// Text("Button Click2")
// }
// .halfSheet(showSheet: $showSheet) {
// Text("HELLO HALF")
// } onEnd: {
// print("?")
// }
// // }
// }
//}
extension View {
func halfSheet<SheetView: View>(showSheet: Binding<Bool>, @ViewBuilder sheetView: @escaping ()->SheetView, onEnd: @escaping ()->() ) -> some View {
return self
.background(
//
HalfSheetHelper(sheetView: sheetView(), showSheet: showSheet, onEnd: onEnd)
)
}
}
//UIKit
struct HalfSheetHelper<SheetView: View>: UIViewControllerRepresentable {
var sheetView: SheetView
@Binding var showSheet: Bool
var onEnd: ()->()
//
let vc = UIViewController()
func makeCoordinator() -> Coordinator {
return Coordinator(parent: self)
}
func makeUIViewController(context: Context) -> UIViewController {
vc.view.backgroundColor = .clear
return vc
}
func updateUIViewController(_ uiViewController: UIViewController, context: Context) {
if showSheet {
let sheetController = CustomHostingController(rootView: sheetView)
sheetController.presentationController?.delegate = context.coordinator
uiViewController.present(sheetController, animated: true)
}
else {
// showSheet view
// uiViewController.dismiss(animated: true)
uiViewController.presentedViewController?.dismiss(animated: true)
}
}
//
class Coordinator: NSObject, UISheetPresentationControllerDelegate {
var parent: HalfSheetHelper
init(parent: HalfSheetHelper) {
self.parent = parent
}
func presentationControllerDidDismiss(_ presentationController: UIPresentationController) {
parent.showSheet = false
parent.onEnd()
}
}
}
class CustomHostingController<Content: View>: UIHostingController<Content> {
override func viewDidLoad() {
// view.backgroundColor = .clear
//
if let presentationController = presentationController as? UISheetPresentationController {
presentationController.detents = [.medium()]
//
presentationController.prefersGrabberVisible = false
}
}
}