'UIViewControllerRepresentable'를 사용해서 UIKit의 UIImagePickerController를 가져와준다. 그리고 coordinator를 만들어줘서 필요한 delegate의 function들을 사용해준다.
struct ImagePickerView: UIViewControllerRepresentable {
var sourceType : UIImagePickerController.SourceType = .photoLibrary
@Binding var image : UIImage?
@Binding var isPresented : Bool
func makeCoordinator() -> ImagePickerCoordinator {
return ImagePickerCoordinator(image: $image, isPresented: $isPresented)
}
func makeUIViewController(context: Context) -> UIImagePickerController {
let imagePicker = UIImagePickerController()
imagePicker.sourceType = sourceType
imagePicker.delegate = context.coordinator
return imagePicker
}
func updateUIViewController(_ uiViewController: UIImagePickerController, context: Context) {
}
}
class ImagePickerCoordinator : NSObject, UINavigationControllerDelegate, UIImagePickerControllerDelegate {
@Binding var image : UIImage?
@Binding var isPresented : Bool
init(image : Binding<UIImage?>, isPresented : Binding<Bool>) {
self._image = image
self._isPresented = isPresented
}
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
if let image = info[UIImagePickerController.InfoKey.originalImage] as? UIImage {
self.image = image
}
self.isPresented = false
}
func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
self.isPresented = false
}
}
*참고로 binding하는 image를 그냥 Image로 사용해도 잘 돌아감.