在iOS 8上,我希望将所有图片存储在设备上。我的问题是我确实得到了它们,但有些不止一次。 PHAsset
属性(隐藏,mediaSubtypes等)对于所有图片都是相同的,因此我不能排除PHAssetMediaSubtypePhotoHDR
子类型。我找到的唯一方法是不添加具有相同日期的多张图片,但是当使用相同的创建日期保存多张照片时,这是一个问题。
有人知道为什么我会得到这些副本以及我能做些什么来避免它们?
这就是我拍照的方式:
PHFetchOptions *fetchOptions = [PHFetchOptions new];
fetchOptions.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"creationDate" ascending:YES],];
PHFetchResult *phAssets = [PHAsset fetchAssetsWithMediaType:PHAssetMediaTypeImage options:fetchOptions];
答案 0 :(得分:6)
自iOS 8.1起,fetchAssetsWithMediaType:
和fetchAssetsWithOptions:
方法的行为发生了变化,并且不再包含从iTunes同步到设备的照片或存储在iCloud共享照片流中的照片。
答案 1 :(得分:5)
您可以尝试使用Moments Collections:
PHFetchResult * moments = [PHAssetCollection fetchMomentsWithOptions:nil];
for (PHAssetCollection * moment in moments) {
PHFetchResult * assetsFetchResults = [PHAsset fetchAssetsInAssetCollection:moment options:nil];
for (PHAsset * asset in assetsFetchResults) {
//Do something with asset, for example add them to array
}
}
答案 2 :(得分:3)
我遇到了同样的问题,对我来说,重复的是我的照片流专辑中的图片。为了解决这个问题,我现在使用PHAssetCollection类中的FetchMoments方法,然后在获取结果中的每个时刻获取所有资产。通过这种方式,我可以获得所有图像而无需重复图像。
如果有人找到更好的解决方案,请告诉我。
答案 3 :(得分:0)
在传单上,这些资产是爆发的一部分吗? (参见PHAsset.burstIdentifier
等)如果是,您可以相应调整。
答案 4 :(得分:0)
您可以使用“PHImageRequestOptions”来设置高质量的图像,例如!
//Setting up the deliveryMode in PHImageRequestOptions()
fileprivate func imageRequestOptions() -> PHImageRequestOptions {
let requestOption = PHImageRequestOptions()
requestOption.deliveryMode = .highQualityFormat
return requestOption
}
fileprivate func fetchImages(){
let fetchOptions = assetsFetchOptions() //get fetchOptions only. Don`t worry
let allPhotos = PHAsset.fetchAssets(with: .image, options: fetchOptions)
allPhotos.enumerateObjects({ (asset, index, stop) in
print(asset)
let imageManager = PHImageManager.default()
let targetSize = CGSize(width: 200, height: 200)
//This function uses the "imageRequestOptions()" function to set up the "options:" field in this .requestImage() function.
imageManager.requestImage(for: asset, targetSize: targetSize, contentMode: .aspectFit, options: self.imageRequestOptions(), resultHandler: { (image, info) in
if let image = image {
self.images.append(image)
self.assets.append(asset)
if self.selectedImage == nil {
self.selectedImage = image
}
}
if index == allPhotos.count - 1 {
self.collectionView?.reloadData()
}
})
})
}