import SwiftUI /// SwiftUI Wrapper for UIImagePickerController. struct ImagePicker: UIViewControllerRepresentable { var sourceType: UIImagePickerController.SourceType = .photoLibrary @Binding var selectedImage: UIImage? @Environment(\.dismiss) private var dismiss func makeUIViewController(context: UIViewControllerRepresentableContext) -> UIImagePickerController { let imagePicker = UIImagePickerController() imagePicker.allowsEditing = true imagePicker.sourceType = sourceType if sourceType == .camera { imagePicker.showsCameraControls = true } imagePicker.delegate = context.coordinator return imagePicker } func updateUIViewController( _: UIImagePickerController, context _: UIViewControllerRepresentableContext ) {} func makeCoordinator() -> Coordinator { Coordinator(self) } final class Coordinator: NSObject, UIImagePickerControllerDelegate, UINavigationControllerDelegate { var parent: ImagePicker init(_ parent: ImagePicker) { self.parent = parent } func imagePickerController( _: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey: Any] ) { if let image = info[UIImagePickerController.InfoKey.editedImage] as? UIImage { withAnimation { parent.selectedImage = image } } parent.dismiss() } } }