PHAssetCollection
- 父类:PHCollection
一个照片资源分类的表现形式,例如一个时刻,用户创建的相册或者智能相册。
一、概述
在Photos框架中,集合对象(包括资源集合)不会直接使用它们的成员对象,并且也没有其他的对象来直接使用集合对象。为了获取一个资源集合的成员,应使用PHAsset的类方法,例如+ (PHFetchResult<PHAsset *> *)fetchAssetsInAssetCollection:(PHAssetCollection *)assetCollection options:(PHFetchOptions *)options;
。为了查找资源集合,应使用下面的“获取资源集合”中的方法。
苹果爸爸的文档库中还有一个关于请求权限的重要说明,我已经放在了这里。
像资源和集合列表一样,资源集合是不可变的。想要创建、重命名、删除资源集合,或者想要在一个资源集合中添加成员、移除成员、对成员重新排序,应在一个照片库的变化回调中创建一个PHAssetCollectionChangeRequest对象。想要更多的关于改变请求和使用变化回调更新照片库,请查看PHPhotoLibrary。
二、内容
1. 获取资源集合
+ (PHFetchResult<PHAssetCollection *> *)fetchAssetCollectionsWithLocalIdentifiers:(NSArray<NSString *> *)identifiers options:(nullable PHFetchOptions *)options;
通过给定的唯一标识(localIdentifier
属性)查找对应的资源集合。如果没有对应的资源集合则返回空的获取结果。
+ (PHFetchResult<PHAssetCollection *> *)fetchAssetCollectionsWithType:(PHAssetCollectionType)type subtype:(PHAssetCollectionSubtype)subtype options:(nullable PHFetchOptions *)options;
查找给定类型和给定子类型的资源集合。如果没有对应的资源集合则返回空的获取结果。
PHAssetCollectionType
typedef NS_ENUM(NSInteger, PHAssetCollectionType) {
PHAssetCollectionTypeAlbum = 1, // 在 照片 应用中创建的相簿或者通过iTunes同步的在iOS设备上显示的相簿
PHAssetCollectionTypeSmartAlbum = 2, // 照片 应用中内置的相簿
PHAssetCollectionTypeMoment = 3, // 照片 应用中的 时刻
} PHOTOS_ENUM_AVAILABLE_IOS_TVOS(8_0, 10_0);
PHAssetCollectionSubtype
typedef NS_ENUM(NSInteger, PHAssetCollectionSubtype) {
// PHAssetCollectionTypeAlbum regular subtypes
PHAssetCollectionSubtypeAlbumRegular = 2, // 在 相册 应用中创建的相簿
PHAssetCollectionSubtypeAlbumSyncedEvent = 3, // 从iPhone中同步到设备的 事件
PHAssetCollectionSubtypeAlbumSyncedFaces = 4, // 从iPhone中同步到设备的 面孔(人物)
PHAssetCollectionSubtypeAlbumSyncedAlbum = 5, // 从iPhone中同步到设备的相簿
PHAssetCollectionSubtypeAlbumImported = 6, // 从相机或者外部存储设备中导入的相簿
// PHAssetCollectionTypeAlbum shared subtypes
PHAssetCollectionSubtypeAlbumMyPhotoStream = 100, // 用户自己的iCloud照片流
PHAssetCollectionSubtypeAlbumCloudShared = 101, // 一个iCloud共享照片流
// PHAssetCollectionTypeSmartAlbum subtypes
PHAssetCollectionSubtypeSmartAlbumGeneric = 200, // 没有指定子类型的智能相簿
PHAssetCollectionSubtypeSmartAlbumPanoramas = 201, // 包含了照片库中所有全景照片的智能相簿——全景照片
PHAssetCollectionSubtypeSmartAlbumVideos = 202, // 包含了照片库中所有视频的智能相簿——视频
PHAssetCollectionSubtypeSmartAlbumFavorites = 203, // 包含了照片库中所有用户标记为喜欢的资源的智能相簿——个人收藏
PHAssetCollectionSubtypeSmartAlbumTimelapses = 204, // 包含了照片库中所有延时视频的智能相簿——慢动作
PHAssetCollectionSubtypeSmartAlbumAllHidden = 205, // 包含了 照片 应用中所有从 时刻 中隐藏的资源的智能相簿——
PHAssetCollectionSubtypeSmartAlbumRecentlyAdded = 206, // 包含了所有最近添加到图片库的资源的智能相簿——
PHAssetCollectionSubtypeSmartAlbumBursts = 207, // 包含了所有连拍的智能相簿——连拍快照
PHAssetCollectionSubtypeSmartAlbumSlomoVideos = 208, // 包含了 照片 应用中所有慢动作视频的智能相簿——慢动作
PHAssetCollectionSubtypeSmartAlbumUserLibrary = 209, // 包含了所有用户自己的图库的资源的智能相簿(而不是来自于iCloud共享流的资源)
PHAssetCollectionSubtypeSmartAlbumSelfPortraits PHOTOS_AVAILABLE_IOS_TVOS(9_0, 10_0) = 210, // 包含了所有使用前置摄像头拍摄的资源的智能相册——自拍
PHAssetCollectionSubtypeSmartAlbumScreenshots PHOTOS_AVAILABLE_IOS_TVOS(9_0, 10_0) = 211, // 包含了所有使用屏幕截图的资源的智能相册——屏幕快照
PHAssetCollectionSubtypeSmartAlbumDepthEffect PHOTOS_AVAILABLE_IOS_TVOS(10_2, 10_1) = 212, // 包含了所有兼容设备上使用景深效果拍摄的资源的智能相册
PHAssetCollectionSubtypeSmartAlbumLivePhotos PHOTOS_AVAILABLE_IOS_TVOS(10_3, 10_2) = 213, // 包含了所有Live Photo的智能相册——Live Photo
// Used for fetching, if you don't care about the exact subtype
PHAssetCollectionSubtypeAny = NSIntegerMax // 所有可能的子类型
} PHOTOS_ENUM_AVAILABLE_IOS_TVOS(8_0, 10_0);
+ (PHFetchResult<PHAssetCollection *> *)fetchAssetCollectionsContainingAsset:(PHAsset *)asset withType:(PHAssetCollectionType)type options:(nullable PHFetchOptions *)options;
查找给定类型并且包含给定资源的资源集合。如果没有对应的资源集合则返回空的获取结果。
+ (PHFetchResult<PHAssetCollection *> *)fetchAssetCollectionsWithALAssetGroupURLs:(NSArray<NSURL *> *)assetGroupURLs options:(nullable PHFetchOptions *)options;
通过Assets Library框架提供的URLs
查找对应的资源集合。如果没有对应的资源集合则返回空的获取结果。
Assets Library框架在iOS 8.0之后就不建议被使用了。
+ (PHFetchResult<PHAssetCollection *> *)fetchMomentsInMomentList:(PHCollectionList *)momentList options:(nullable PHFetchOptions *)options;
获取指定的时刻列表中的时刻。如果没有对应的资源集合则返回空的获取结果。
照片应用会在拍摄时自动创建对应的时刻和地点的分组,并创建时刻列表来组合相关的时刻。时刻列表有两个子类型:一群相关时刻的分组,还有一年内所有时刻的群组。
+ (PHFetchResult<PHAssetCollection *> *)fetchMomentsWithOptions:(nullable PHFetchOptions *)options;
获取在照片应用中看到的时刻一样的资源集合。
2. 读取资源集合的数据
@property (nonatomic, assign, readonly) PHAssetCollectionType assetCollectionType;
资源集合的类型,例如一个相簿或者一个时刻。
@property (nonatomic, assign, readonly) PHAssetCollectionSubtype assetCollectionSubtype;
资源集合的子类型。使用子类型在同类型的集合之间进行细微区别。
@property (nonatomic, assign, readonly) NSUInteger estimatedAssetCount;
资源集合中资源的估算数量。
这个数量可能与当前集合中的资源数不一样。想要获得最新的资源数量请使用+ (PHFetchResult<PHAsset *>*)fetchAssetsInAssetCollection:(PHAssetCollection *)assetCollection options:(PHFetchOptions *)options;
获取集合中的资源然后读取获取结果中的count
属性。
如果对于某个集合来说资源数量是不可用的属性,则则个属性的值是NSNotFound。
@property (nonatomic, strong, readonly, nullable) NSDate *startDate;
资源集合中所有资源中最早的一个的创建日期。
这个属性仅在资源集合的类型为PHAssetCollectionTypeMoment
时有效。对于其他类型,这个属性的值为nil
。
@property (nonatomic, strong, readonly, nullable) NSDate *endDate;
资源集合中所有资源中距离现在时间最近的一个的创建日期。
这个属性仅在资源集合的类型为PHAssetCollectionTypeMoment
时有效。对于其他类型,这个属性的值为nil
。
@property (nonatomic, strong, readonly, nullable) CLLocation *approximateLocation;
资源集合中所有资源的定位地点。
照片应用会在拍摄时自动创建对应的时刻和地点的分组,同一时刻照片资源的地点应该非常接近,所以这个属性表示的是一个大致的共有的定位地点。
这个属性仅在资源集合的类型为PHAssetCollectionTypeMoment
时有效。对于其他类型,这个属性的值为nil
。
@property (nonatomic, strong, readonly) NSArray<NSString *> *localizedLocationNames;
资源集合中所有资源的定位地点的名称。
照片应用会在拍摄时自动创建对应的时刻和地点的分组,同一时刻照片资源的地点应该非常接近,但有可能有多个地点名称,所以这个属性表示的是一个定位地点名称组成的数组。
这个属性仅在资源集合的类型为PHAssetCollectionTypeMoment
时有效。对于其他类型,这个属性的值为nil
。
3. 创建临时资源(asset)
集合
+ (PHAssetCollection *)transientAssetCollectionWithAssets:(NSArray<PHAsset *> *)assets title:(nullable NSString *)title;
- assets NSArray<PHAsset *> - PHAsset对象组成的数组,要包含的资源。
- title NSString - 临时资源集合的标题。
创建一个包含给定资源的临时资源集合。
临时的资源集合。不会被保存,也不会被存储到iCloud中,更不会在相册应用中和其他使用Photos框架的应用显示。
+ (PHAssetCollection *)transientAssetCollectionWithAssetFetchResult:(PHFetchResult<PHAsset *> *)fetchResult title:(nullable NSString *)title;
创建一个包含获取结果中的资源的临时资源集合。
获取结果中至少要包含一个PHAsset对象。
临时的资源集合。不会被保存,也不会被存储到iCloud中,更不会在相册应用中和其他使用Photos框架的应用显示。