// // ImagePicker.swift // // Created by JungpyoHong on 4/21/21. // import UIKit public protocol ImagePickerDelegate: AnyObject { func didSelect(image: UIImage?) } open class ImagePicker: NSObject { private let imagePicker: UIImagePickerController private weak var presentationController: UIViewController? private weak var delegate: ImagePickerDelegate? public init(presentationController: UIViewController, delegate: ImagePickerDelegate) { self.imagePicker = UIImagePickerController() super.init() self.presentationController = presentationController self.delegate = delegate self.imagePicker.delegate = self self.imagePicker.allowsEditing = true self.imagePicker.mediaTypes = ["public.image"] } private func action(for type: UIImagePickerController.SourceType, title: String) -> UIAlertAction? { guard UIImagePickerController.isSourceTypeAvailable(type) else { return nil } return UIAlertAction(title: title, style: .default) { [weak self] _ in self?.imagePicker.sourceType = type self?.presentationController?.present(self?.imagePicker ?? UIImagePickerController(), animated: true) } } public func present(from sourceView: UIView) { let alertController = UIAlertController(title: nil, message: nil, preferredStyle: .actionSheet) if let action = self.action(for: .camera, title: "Take photo") { alertController.addAction(action) } if let action = self.action(for: .savedPhotosAlbum, title: "Camera roll") { alertController.addAction(action) } if let action = self.action(for: .photoLibrary, title: "Photo library") { alertController.addAction(action) } alertController.addAction(UIAlertAction(title: "Cancel", style: .cancel, handler: nil)) self.presentationController?.present(alertController, animated: true) } private func pickerController(_ controller: UIImagePickerController, didSelect image: UIImage?) { controller.dismiss(animated: true, completion: nil) self.delegate?.didSelect(image: image) } } extension ImagePicker: UIImagePickerControllerDelegate { public func imagePickerControllerDidCancel(_ picker: UIImagePickerController) { self.pickerController(picker, didSelect: nil) } public func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey: Any]) { guard let image = info[.editedImage] as? UIImage else { return self.pickerController(picker, didSelect: nil) } self.pickerController(picker, didSelect: image) } } extension ImagePicker: UINavigationControllerDelegate { }