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

问题描述:

这听起来可能是重复的,但在搜索之后,我仍然没有得到Swift 3的预期答案。 在我尝试添加资产时使用addAssets()创建资产占位符方法Xcode建议我将cast assetPlacehoder转换为FastEnumeration类型。当我这样做的时候,它会导致一个异常。有人可以帮我吗?如何在Swift 3中创建自定义相册iOS 10

+0

您可以发布您收到的例外吗? – bjtitus

+0

@ bjtitus,这是我得到的异常:'[通用]创建一个未知类型的图像格式是一个错误 无法将类型'PHAsset'(0x15e4a0578)的值转换为'NSFastEnumeration'(0x15d4d86e0).' –

使用此课程并在需要时和在将图像添加到相册之前征求权限。

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() 
      }) 
     } 
} 

调用此方法要保存图像。

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

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

什么曾经调用requestAuthorizationHandler?应该首先调用它来创建相册。 – VagueExplanation