Swift技术问询:如何获取相册中除截图、连拍、实况外的PHAsset?
解决方法
你的代码目前只筛选了PHAssetMediaType.image类型的资源,但没有排除截图、连拍和实况照片这三类特殊图片。我们需要在NSPredicate中添加额外的排除条件,具体如下:
关键排除条件解析
- 排除截图:利用
PHAsset的isScreenshot属性,直接判断是否为截图 - 排除连拍照片:连拍组内的所有asset会共享同一个
burstIdentifier,所以只要该属性为nil,就不属于连拍资源 - 排除实况照片:实况照片属于图片的子类型,对应的枚举是
PHAssetMediaSubtype.imageLive,我们需要排除包含这个子类型的资源
完整代码示例
let options = PHFetchOptions() options.sortDescriptors = [NSSortDescriptor(key: "creationDate", ascending: true)] // 组合所有筛选条件:是图片 + 非截图 + 非连拍 + 非实况照片 options.predicate = NSPredicate(format: """ mediaType = %d AND isScreenshot = NO AND burstIdentifier == nil AND (mediaSubtypes & %d) == 0 """, PHAssetMediaType.image.rawValue, PHAssetMediaSubtype.imageLive.rawValue) let assets = PHAsset.fetchAssets(with: options)
代码说明
- 谓词中的
(mediaSubtypes & %d) == 0是位运算判断,确保asset的媒体子类型不包含实况照片的标识 - 所有条件用
AND连接,保证同时满足“是图片”且“不属于三类排除项”的要求
内容的提问来源于stack exchange,提问作者kuwhkud
相关产品推荐
相关产品推荐

