Last active
May 28, 2016 02:37
-
-
Save danielt1263/b92163d6055e1a580d493676e5b1e448 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// | |
// UIViewController+GetImage.swift | |
// | |
// Created by Daniel Tartaglia on 4/25/16. | |
// Copyright © 2016 MIT License | |
// | |
import UIKit | |
import PromiseKit | |
enum ImagePickerError: ErrorType { | |
case UserCanceled | |
} | |
extension UIViewController { | |
func getImage(focusView view: UIView) -> Promise<UIImage> { | |
let proxy = ImagePickerProxy() | |
let cameraAction: UIAlertAction? = !UIImagePickerController.isSourceTypeAvailable(.Camera) ? nil : UIAlertAction(title: "Camera", style: .Default) { _ in | |
let controller = UIImagePickerController() | |
controller.delegate = proxy | |
controller.allowsEditing = true | |
controller.sourceType = .Camera | |
self.presentViewController(controller, animated: true, completion: nil) | |
} | |
let photobinAction: UIAlertAction? = !UIImagePickerController.isSourceTypeAvailable(.PhotoLibrary) ? nil : UIAlertAction(title: "Photos", style: .Default) { _ in | |
let controller = UIImagePickerController() | |
controller.delegate = proxy | |
controller.allowsEditing = false | |
controller.sourceType = .PhotoLibrary | |
self.presentViewController(controller, animated: true, completion: nil) | |
} | |
let cancelAction = UIAlertAction(title: "Cancel", style: .Cancel, handler: nil) | |
let alert = UIAlertController(title: nil, message: nil, preferredStyle: .ActionSheet) | |
if let cameraAction = cameraAction { | |
alert.addAction(cameraAction) | |
} | |
if let photobinAction = photobinAction { | |
alert.addAction(photobinAction) | |
} | |
alert.addAction(cancelAction) | |
let popoverPresentationController = alert.popoverPresentationController | |
popoverPresentationController?.sourceView = view | |
popoverPresentationController?.sourceRect = view.bounds | |
presentViewController(alert, animated: true, completion: nil) | |
let promise = proxy.promise | |
return promise.always { | |
self.dismissViewControllerAnimated(true, completion: nil) | |
proxy.retainCycle = nil | |
} | |
} | |
} | |
private final class ImagePickerProxy: NSObject, UIImagePickerControllerDelegate, UINavigationControllerDelegate { | |
let (promise, fulfill, reject) = Promise<UIImage>.pendingPromise() | |
var retainCycle: ImagePickerProxy? | |
required override init() { | |
super.init() | |
retainCycle = self | |
} | |
@objc func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]) { | |
let image = (info[UIImagePickerControllerEditedImage] as? UIImage) ?? (info[UIImagePickerControllerOriginalImage] as! UIImage) | |
fulfill(image) | |
} | |
@objc func imagePickerControllerDidCancel(picker: UIImagePickerController) { | |
reject(ImagePickerError.UserCanceled) | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment