// The MIT License (MIT) // // Copyright (c) 2015 Joakim Gyllström // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. import UIKit import Photos /** BSImagePickerViewController. Use settings or buttons to customize it to your needs. */ public class BSImagePickerViewController : UINavigationController { /** Object that keeps settings for the picker. */ public var settings: BSImagePickerSettings = Settings() /** Done button. */ public var doneButton: UIBarButtonItem = UIBarButtonItem(barButtonSystemItem: .Done, target: nil, action: nil) /** Cancel button */ public var cancelButton: UIBarButtonItem = UIBarButtonItem(barButtonSystemItem: .Cancel, target: nil, action: nil) /** Default selections */ public var defaultSelections: PHFetchResult? /** Fetch results. */ public lazy var fetchResults: [PHFetchResult] = { let fetchOptions = PHFetchOptions() // Camera roll fetch result let cameraRollResult = PHAssetCollection.fetchAssetCollectionsWithType(.SmartAlbum, subtype: .SmartAlbumUserLibrary, options: fetchOptions) // Albums fetch result let albumResult = PHAssetCollection.fetchAssetCollectionsWithType(.Album, subtype: .Any, options: fetchOptions) return [cameraRollResult, albumResult] }() var albumTitleView: AlbumTitleView = bundle.loadNibNamed("AlbumTitleView", owner: nil, options: nil).first as! AlbumTitleView static let bundle: NSBundle = NSBundle(path: NSBundle(forClass: PhotosViewController.self).pathForResource("BSImagePicker", ofType: "bundle")!)! lazy var photosViewController: PhotosViewController = { let vc = PhotosViewController(fetchResults: self.fetchResults, defaultSelections: self.defaultSelections, settings: self.settings) vc.doneBarButton = self.doneButton vc.cancelBarButton = self.cancelButton vc.albumTitleView = self.albumTitleView return vc }() class func authorize(status: PHAuthorizationStatus = PHPhotoLibrary.authorizationStatus(), fromViewController: UIViewController, completion: (authorized: Bool) -> Void) { switch status { case .Authorized: // We are authorized. Run block completion(authorized: true) case .NotDetermined: // Ask user for permission PHPhotoLibrary.requestAuthorization({ (status) -> Void in dispatch_async(dispatch_get_main_queue(), { () -> Void in self.authorize(status, fromViewController: fromViewController, completion: completion) }) }) default: () dispatch_async(dispatch_get_main_queue(), { () -> Void in completion(authorized: false) }) } } /** Sets up an classic image picker with results from camera roll and albums */ public init() { super.init(nibName: nil, bundle: nil) } /** https://www.youtube.com/watch?v=dQw4w9WgXcQ */ required public init?(coder aDecoder: NSCoder) { super.init(coder: aDecoder) } /** Load view. See apple documentation */ public override func loadView() { super.loadView() // TODO: Settings view.backgroundColor = UIColor.whiteColor() // Make sure we really are authorized if PHPhotoLibrary.authorizationStatus() == .Authorized { setViewControllers([photosViewController], animated: false) } } } // MARK: ImagePickerSettings proxy extension BSImagePickerViewController: BSImagePickerSettings { /** See BSImagePicketSettings for documentation */ public var maxNumberOfSelections: Int { get { return settings.maxNumberOfSelections } set { settings.maxNumberOfSelections = newValue } } /** See BSImagePicketSettings for documentation */ public var selectionCharacter: Character? { get { return settings.selectionCharacter } set { settings.selectionCharacter = newValue } } /** See BSImagePicketSettings for documentation */ public var selectionFillColor: UIColor { get { return settings.selectionFillColor } set { settings.selectionFillColor = newValue } } /** See BSImagePicketSettings for documentation */ public var selectionStrokeColor: UIColor { get { return settings.selectionStrokeColor } set { settings.selectionStrokeColor = newValue } } /** See BSImagePicketSettings for documentation */ public var selectionShadowColor: UIColor { get { return settings.selectionShadowColor } set { settings.selectionShadowColor = newValue } } /** See BSImagePicketSettings for documentation */ public var selectionTextAttributes: [String: AnyObject] { get { return settings.selectionTextAttributes } set { settings.selectionTextAttributes = newValue } } /** See BSImagePicketSettings for documentation */ public var cellsPerRow: (verticalSize: UIUserInterfaceSizeClass, horizontalSize: UIUserInterfaceSizeClass) -> Int { get { return settings.cellsPerRow } set { settings.cellsPerRow = newValue } } /** See BSImagePicketSettings for documentation */ public var takePhotos: Bool { get { return settings.takePhotos } set { settings.takePhotos = newValue } } public var takePhotoIcon: UIImage? { get { return settings.takePhotoIcon } set { settings.takePhotoIcon = newValue } } } // MARK: Album button extension BSImagePickerViewController { /** Album button in title view */ public var albumButton: UIButton { get { return albumTitleView.albumButton } set { albumTitleView.albumButton = newValue } } }