2017-07-13 14 views
0

ユーザーが画面に配置する写真を選択し、コードがカスタムアルバムに自動的に挿入するプログラムがあります。しかし、画像を選択するたびに、それはカメラロールに保存され、重複が作成されます。これをやめさせるにはどうすればいいですか?画像を選択すると、カメラロールに再保存されます

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

    var picturePlaceHolder: PHObjectPlaceholder? = nil 

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

func save(image: UIImage) { 
    if assetCollection == nil { 
     return 
    } 

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

    }, completionHandler: nil) 
} 

答えて

0

私は同様の質問投稿: Swift 3 or 4 Saving to custom album creates duplicate images

をしかし、私は同様にコオロギが、何も得ませんでした。幸いにも、私は答えを見つけたと思う。私は自分の質問にも答えます。

あなたが持っているコード(私が持っていたのと同じコードでした)は、新しいアセットを作成することです。これは、ユーザーがカメラで写真を撮った後にカスタムアルバムに画像を保存する場合にのみ便利です。これは新しい資産のためのものです。

ただし、既存のアセットの場合、新しいアセットを作成する必要はありません。代わりに、既存のアセットをカスタムアルバムに追加する必要があります。これを行うには、別の方法が必要です。ここに私が作成したコードがあり、それは動作しているようです。自分のメソッドに送信して既存のアセットにアクセスできるように、アセットIDを最初に取得する必要があることに注意してください。

したがって、imagePickerControllerでは、ユーザーが既存のイメージを選択したかどうか、またはメソッドが新しいカメラアクションから呼び出されているかどうかを判断する必要があります。

let pickerSource = picker.sourceType; 
switch(pickerSource){ 
case .savedPhotosAlbum, .photoLibrary: 
    if(let url = info[UIIMagePickerControllerReferenceURL] as? NSURL{ 
    let refURLString = refURL?.absoluteString; 
    /* value for refURLString looks something like assets-library://asset/asset.JPG?id=82A6E75C-EA55-4C3A-A988-4BF8C7F3F8F5&ext=JPG */ 
    let refID = {function here to extract the id query param from the url string} 
    /*above gets you the asset ID, you can get the asset directly, but it is only 
    available in ios 11+. 
    */ 
    MYPHOTOHELPERCLASS.transferImage(toAlbum: "myalbumname", withID: refID!, ...) 

} 
break; 
case .camera: 
... 
break; 
} 

今、あなたのphotohelperクラスに(または任意のどこでも任意の関数、中)、資産をEDITはなく、新しいものを作成するには、これは私が持っているものです。私はchangeRequest変数を省略することができると仮定しています。この権利を得るまで、私は周りを遊んでいました。完全にばかげたリンゴのドキュメントを見て、少なくとも私は遊ぶべき他の方法があることに気づくことができました。 NSFastEnumerationパラメータは、プレースホルダPHObjectPlaceholderオブジェクトだけでなく、PHAssetsのNSArrayでもかまいません。

public static func transferImage(toAlbum albumName:String, withID imageID:String, onSuccess success:@escaping(String)->Void, onFailure failure:@escaping(Error?)->Void){ 

    guard let album = self.getAlbum(withName: albumName) else{ 
    ... failure here, albumNotFoundError 
    return; 
    } 

    if(self.hasImageInAlbum(withIdentifier: imageID, fromAlbum: albunName)){ 
    ... failure here, image already exists in the album, do not make another 
    return; 
    } 

    let theAsset = self.getExistingAsset(withLocalIdentifier: imageID); 
    if(theAsset == nil){ 
    ... failure, no asset for asset id 
    return; 
    } 

    PHPhotoLibrary.shared().performChanges({ 
     let albumChangeRequest = PHAssetCollectionChangeRequest(for: album); 
     let changeRequest = PHAssetChangeRequest.init(for: theAsset!); 
     let enumeration:NSArray = [theAsset!]; 
     let cnt = album.estimatedAssetCount; 
     if(cnt == 0){ 
      albumChangeRequest?.addAssets(enumeration); 
     }else{ 
      albumChangeRequest?.inserAssets(enumeration, at: [0]); 
     } 
    }){didSucceed, error) in 
     OperationQueue.main.addOperation({ 
     didSucceed ? success(imageID) : failure(error); 
     }) 
    } 

} 

だから、それは代わりに資産作成要求を作成し、作成した資産のためのプレースホルダを生成する以外、ほとんど同じである、あなたはだけでなく、既存の資産を取得するために、既存のアセットIDを使用して、既存の追加します新たに作成されたアセットプレースホルダではなく、addasset/insertasset NSArrayパラメータにアセットを追加します。

関連する問題