Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to save image to custom album?

Tags:

ios

swift

ios8

I have a brand new iOS app that generates images and lets the users save them into the Camera SavedPhotosAlbum. However, I wanna do something like Snapchat and Frontback, and save these images also to a custom-named album.

So this is my code right now:

let imageToSave = self.currentPreviewImage  let softwareContext = CIContext(options:[kCIContextUseSoftwareRenderer: true]) let cgimg = softwareContext.createCGImage(imageToSave, fromRect:imageToSave.extent())  ALAssetsLibrary().writeImageToSavedPhotosAlbum(cgimg, metadata:imageToSave.properties(), completionBlock:nil) 

I've seen a few examples of people doing this in Objective-C but nothing that I could translate to Swift, and I've check the writeImageToSavedPhotosAlbum method signatures and none of them seem to allow saving to a custom album.

like image 260
rodrigoalvesvieira Avatar asked Feb 25 '15 00:02

rodrigoalvesvieira


People also ask

How do you make a custom album on iPhone?

Create a new albumOpen Photos. Tap New Album. Type an album name, tap Save, then choose the photos and videos that you want to add. Tap Done.


1 Answers

I came up with this singleton class to handle it:

import Photos  class CustomPhotoAlbum {      static let albumName = "Flashpod"     static let sharedInstance = CustomPhotoAlbum()      var assetCollection: PHAssetCollection!      init() {          func fetchAssetCollectionForAlbum() -> PHAssetCollection! {              let fetchOptions = PHFetchOptions()             fetchOptions.predicate = NSPredicate(format: "title = %@", CustomPhotoAlbum.albumName)             let collection = PHAssetCollection.fetchAssetCollectionsWithType(.Album, subtype: .Any, options: fetchOptions)              if let firstObject: AnyObject = collection.firstObject {                 return collection.firstObject as! PHAssetCollection             }              return nil         }          if let assetCollection = fetchAssetCollectionForAlbum() {             self.assetCollection = assetCollection             return         }          PHPhotoLibrary.sharedPhotoLibrary().performChanges({             PHAssetCollectionChangeRequest.creationRequestForAssetCollectionWithTitle(CustomPhotoAlbum.albumName)         }) { success, _ in             if success {                 self.assetCollection = fetchAssetCollectionForAlbum()             }         }     }      func saveImage(image: UIImage) {          if assetCollection == nil {             return   // If there was an error upstream, skip the save.         }          PHPhotoLibrary.sharedPhotoLibrary().performChanges({             let assetChangeRequest = PHAssetChangeRequest.creationRequestForAssetFromImage(image)             let assetPlaceholder = assetChangeRequest.placeholderForCreatedAsset             let albumChangeRequest = PHAssetCollectionChangeRequest(forAssetCollection: self.assetCollection)             albumChangeRequest.addAssets([assetPlaceholder])         }, completionHandler: nil)     }   } 

When you first instantiate the class, the custom album will be created if it doesn't already exist. You can save an image like this:

CustomPhotoAlbum.sharedInstance.saveImage(image) 

NOTE: The CustomPhotoAlbum class assumes the app already has permission to access the Photo Library. Dealing with the permissions is a bit outside the scope of this question/answer. So make sure PHPhotoLibrary.authorizationStatus() == .Authorize before you use it. And request authorization if necessary.

like image 92
scootermg Avatar answered Oct 27 '22 02:10

scootermg