ImagePicker.swift 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. import SwiftUI
  2. import UIKit
  3. /// A helper SwiftUI wrapper for UIImagePickerController to select photos or capture via camera.
  4. struct ImagePicker: UIViewControllerRepresentable {
  5. var sourceType: UIImagePickerController.SourceType = .camera
  6. var onImagePicked: (UIImage) -> Void
  7. @Environment(\.dismiss) private var dismiss
  8. func makeUIViewController(context: Context) -> UIImagePickerController {
  9. let picker = UIImagePickerController()
  10. picker.sourceType = sourceType
  11. picker.delegate = context.coordinator
  12. return picker
  13. }
  14. func updateUIViewController(_ uiViewController: UIImagePickerController, context: Context) {}
  15. func makeCoordinator() -> Coordinator {
  16. Coordinator(self)
  17. }
  18. class Coordinator: NSObject, UIImagePickerControllerDelegate, UINavigationControllerDelegate {
  19. let parent: ImagePicker
  20. init(_ parent: ImagePicker) {
  21. self.parent = parent
  22. }
  23. func imagePickerController(
  24. _ picker: UIImagePickerController,
  25. didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey: Any]
  26. ) {
  27. if let image = info[.originalImage] as? UIImage {
  28. parent.onImagePicked(image)
  29. }
  30. parent.dismiss()
  31. }
  32. func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
  33. parent.dismiss()
  34. }
  35. }
  36. }