简体   繁体   English

如何在Swift 3 iOS 10中创建自定义相册

[英]How to create custom album in Swift 3 iOS 10

This may sound repetitive but after searching for while I still not got the intended answer for Swift 3. After creating a placeholder for asset when i'm trying to add Assets using addAssets() method Xcode suggesting me to Cast assetPlacehoder to FastEnumeration type. 这可能听起来很重复但是在搜索之后我仍然没有得到Swift 3的预期答案。当我尝试使用addAssets()方法添加资产时创建资源占位符Xcode建议我将assetPlacehoder强制转换为FastEnumeration类型。 And when I did so it is causing an exception. 当我这样做时,它会导致异常。 Can anybody help me out? 有人可以帮帮我吗?

Use this class and ask for permission when you need and before adding image to album. 使用此课程并在需要时以及在将图像添加到相册之前请求许可。

class CustomPhotoAlbum: NSObject {

        static let albumName = "YourAlbumName"
        static let sharedInstance = CustomPhotoAlbum()

        var assetCollection: PHAssetCollection!

        override init() {
            super.init()

            if let assetCollection = fetchAssetCollectionForAlbum() {
                self.assetCollection = assetCollection
                return
            }
        }

        func requestAuthorizationHandler(status: PHAuthorizationStatus) {
            if PHPhotoLibrary.authorizationStatus() == PHAuthorizationStatus.authorized {
                // ideally this ensures the creation of the photo album even if authorization wasn't prompted till after init was done
                print("trying again to create the album")
                self.createAlbum()
            } else {
                print("should really prompt the user to let them know it's failed")
            }
        }

        func createAlbum() {
            PHPhotoLibrary.shared().performChanges({
                PHAssetCollectionChangeRequest.creationRequestForAssetCollection(withTitle: CustomPhotoAlbum.albumName)   // create an asset collection with the album name
            }) { success, error in
                if success {
                    self.assetCollection = self.fetchAssetCollectionForAlbum()
                } else {
                    print("error \(String(describing: error))")
                }
            }
        }

        func fetchAssetCollectionForAlbum() -> PHAssetCollection? {
            let fetchOptions = PHFetchOptions()
            fetchOptions.predicate = NSPredicate(format: "title = %@", CustomPhotoAlbum.albumName)
            let collection = PHAssetCollection.fetchAssetCollections(with: .album, subtype: .any, options: fetchOptions)

            if let _: AnyObject = collection.firstObject {
                return collection.firstObject
            }
            return nil
        }

    func save(image: UIImage , completion : @escaping () -> ()) {
            if assetCollection == nil {
                return                          // if there was an error upstream, skip the save
            }

            PHPhotoLibrary.shared().performChanges({
                let assetChangeRequest = PHAssetChangeRequest.creationRequestForAsset(from: image)
                let assetPlaceHolder = assetChangeRequest.placeholderForCreatedAsset
                let albumChangeRequest = PHAssetCollectionChangeRequest(for: self.assetCollection)
                let enumeration: NSArray = [assetPlaceHolder!]

                if self.assetCollection.estimatedAssetCount == 0
                {
                    albumChangeRequest!.addAssets(enumeration)
                }
                else {
                    albumChangeRequest!.insertAssets(enumeration, at: [0])
                }

            }, completionHandler: { status , errror in
                completion( )  
            })
        }
}

Call this method where you want to save image. 在要保存图像的位置调用此方法。

CustomPhotoAlbum.sharedInstance.save(image: YourImage, completion: {

                        DispatchQueue.main.async(execute: {
                            //"Any UI update should be in main thread."
                        })
                    })

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM