mirror of
https://github.com/jphong1111/awesome-ios-developer.git
synced 2025-01-03 13:31:09 +07:00
83 lines
2.9 KiB
Swift
83 lines
2.9 KiB
Swift
//
|
|
// 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 {
|
|
}
|