iPhone - How to create a custom album and give custom names to photos in camera roll programmatically?

后端 未结 6 1358
孤城傲影
孤城傲影 2020-12-08 01:10

I am developing an iPhone photo application, so i need to create a separate album with a name \"My Album\" in camera roll and i need to save my UIImageView image with custom

6条回答
  •  一整个雨季
    2020-12-08 02:08

    Since the AssetsLibrary is deprecated, please use the Photos framework instead (iOS 8 and later).

    // Deprecated!
    import AssetsLibrary
    
    // Swift 3.0
    let assetsLibrary = ALAssetsLibrary()
    assetsLibrary.addAssetsGroupAlbum(withName: "NewAlbum", resultBlock: { assetsGroup in
        print(assetsGroup == nil ? "Already created" : "Success")
    }, failureBlock: { error in
        print(error)
    })
    

    You can use the shared PHPhotoLibrary object to create new photos but you can't give them specific names because you will be working with assets that need to be managed by the Photos.app. Each asset has specific properties. You can fetch objects, request changes, asset/thumbnail loading and caching, etc.

    To create a custom album, please use the PHAssetCollectionChangeRequest.creationRequestForAssetCollection(withTitle:).

    Brief example:

    // Swift 3.0
    func createPhotoLibraryAlbum(name: String) {
        var albumPlaceholder: PHObjectPlaceholder?
        PHPhotoLibrary.shared().performChanges({
            // Request creating an album with parameter name
            let createAlbumRequest = PHAssetCollectionChangeRequest.creationRequestForAssetCollection(withTitle: name)
            // Get a placeholder for the new album
            albumPlaceholder = createAlbumRequest.placeholderForCreatedAssetCollection
        }, completionHandler: { success, error in
            if success {
                guard let placeholder = albumPlaceholder else {
                    fatalError("Album placeholder is nil")
                }
    
                let fetchResult = PHAssetCollection.fetchAssetCollections(withLocalIdentifiers: [placeholder.localIdentifier], options: nil)
                guard let album: PHAssetCollection = fetchResult.firstObject else {
                    // FetchResult has no PHAssetCollection
                    return
                }
    
                // Saved successfully!
                print(album.assetCollectionType)
            }
            else if let e = error {
                // Save album failed with error
            }
            else {
                // Save album failed with no error
            }
        })
    }
    

    Don't forget to import Photos library.

    To create a new photo asset on that album, please use the PHAssetCollectionChangeRequest.creationRequestForAssetCollection(withTitle:).

    // Swift 3.0
    func createPhotoOnAlbum(photo: UIImage, album: PHAssetCollection) {
        PHPhotoLibrary.shared().performChanges({
            // Request creating an asset from the image
            let createAssetRequest = PHAssetChangeRequest.creationRequestForAsset(from: photo)
            // Request editing the album
            guard let albumChangeRequest = PHAssetCollectionChangeRequest(for: album) else {
                // Album change request has failed
                return
            }
            // Get a placeholder for the new asset and add it to the album editing request
            guard let photoPlaceholder = createAssetRequest.placeholderForCreatedAsset else {
                // Photo Placeholder is nil
                return
            }
            albumChangeRequest.addAssets([photoPlaceholder] as NSArray)
        }, completionHandler: { success, error in
            if success {
                // Saved successfully!
            }
            else if let e = error {
                // Save photo failed with error
            }
            else {
                // Save photo failed with no error
            }
        })
    }
    

    UPDATE:

    We need to request access to be able to use the Photos library:

    PHPhotoLibrary.requestAuthorization { status in
         switch status {
         ...
    }
    

    As of iOS 10 and above we also need to add entry for access in the target .plist file for "Privacy - Photo Library Usage Description":

    NSPhotoLibraryUsageDescription
    Access to photos is needed to provide app features
    

提交回复
热议问题