我有一个程序,用户可以在其中选择要放在屏幕上的照片,然后代码会自动将其放入自定义相册中。但是每当他们选择一张照片时,它会将其重新拍摄到相机胶卷上,从而产生重复照片。我如何让它停止这样做?
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 :(得分:0)
我发布了一个类似的问题: Swift 3 or 4 Saving to custom album creates duplicate images
但我除了蟋蟀之外什么都没有。幸运的是,我想我找到了答案。我也会回答我自己的问题。
您拥有的代码(与我的代码相同)是创建一个新的资产。仅在用户使用相机拍摄照片后将图像保存到自定义相册时才有用。这是为了全新的资产。
但是,对于现有资产,您不希望创建新资产。相反,您希望将现有资源添加到自定义相册中。为此,您需要一种不同的方法。这是我创建的代码,它似乎正在工作。请记住,您必须首先获取资产ID,以便将其发送到您的方法并访问现有资产。
因此,在imagePickerController中,您必须确定用户是选择现有图像还是从新的相机操作调用该方法。
example %>%
group_by(variable) %>%
mutate(current_min = cum_na.rm(value, cummin)) %>%
group_by(current_min) %>%
mutate(time_since_min = time - time[1])
现在,在你的photohelper课程(或任何地方的任何功能,无论如何),编辑资产而不是创建一个新资产,这就是我所拥有的。我假设可以省略changeRequest变量。我一直在玩,直到我做对了。通过完全荒谬的苹果文档,我至少能够注意到还有其他方法可以使用。我发现NSFastEnumeration参数可以是PHAssets的NSArray,而不仅仅是占位符PHObjectPlaceholder对象。
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;
}
因此,它几乎相同,除了创建资产创建请求并为创建的资产生成占位符之外,您只需使用现有资产ID来获取现有资产并将现有资产添加到addasset / insertasset NSArray参数,而不是新创建的资产占位符。