1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495 |
- //
- // SingleImageFetcher.swift
- // ALCameraViewController
- //
- // Created by Alex Littlejohn on 2016/02/16.
- // Copyright © 2016 zero. All rights reserved.
- //
- import UIKit
- import Photos
- public typealias SingleImageFetcherSuccess = (UIImage) -> Void
- public typealias SingleImageFetcherFailure = (NSError) -> Void
- public class SingleImageFetcher {
- private let errorDomain = "com.zero.singleImageSaver"
-
- private var success: SingleImageFetcherSuccess?
- private var failure: SingleImageFetcherFailure?
-
- private var asset: PHAsset?
- private var targetSize = PHImageManagerMaximumSize
- private var cropRect: CGRect?
-
- public init() { }
-
- public func onSuccess(_ success: @escaping SingleImageFetcherSuccess) -> Self {
- self.success = success
- return self
- }
-
- public func onFailure(_ failure: @escaping SingleImageFetcherFailure) -> Self {
- self.failure = failure
- return self
- }
-
- public func setAsset(_ asset: PHAsset) -> Self {
- self.asset = asset
- return self
- }
-
- public func setTargetSize(_ targetSize: CGSize) -> Self {
- self.targetSize = targetSize
- return self
- }
-
- public func setCropRect(_ cropRect: CGRect) -> Self {
- self.cropRect = cropRect
- return self
- }
-
- public func fetch() -> Self {
- _ = PhotoLibraryAuthorizer { error in
- if error == nil {
- self._fetch()
- } else {
- self.failure?(error!)
- }
- }
- return self
- }
-
- private func _fetch() {
-
- guard let asset = asset else {
- let error = errorWithKey("error.cant-fetch-photo", domain: errorDomain)
- failure?(error)
- return
- }
-
- let options = PHImageRequestOptions()
- options.deliveryMode = .highQualityFormat
- options.isNetworkAccessAllowed = true
- if let cropRect = cropRect {
- options.normalizedCropRect = cropRect
- options.resizeMode = .exact
-
- let targetWidth = floor(CGFloat(asset.pixelWidth) * cropRect.width)
- let targetHeight = floor(CGFloat(asset.pixelHeight) * cropRect.height)
-
- targetSize = CGSize(width: targetWidth, height: targetHeight)
- }
-
- PHImageManager.default().requestImage(for: asset, targetSize: targetSize, contentMode: .aspectFill, options: options) { image, _ in
- if let image = image {
- self.success?(image)
- } else {
- let error = errorWithKey("error.cant-fetch-photo", domain: self.errorDomain)
- self.failure?(error)
- }
- }
- }
- }
|