苹果API:https://developer.apple.com/reference/photos
参考://www.greatytc.com/p/42e5d2f75452
参考:http://kayosite.com/ios-development-and-detail-of-photo-framework-part-two.html
首先简单介绍几个概念:
PHAsset: 代表照片库中的一个资源,通过 PHAsset 可以获取和保存资源。
PHFetchOptions: 获取资源时的参数,可以传 nil,即使用系统默认值。
PHFetchResult: 表示一系列的资源集合,也可以是相册的集合。
PHAssetCollection: 表示一个相册或者一个时刻,或者是一个「智能相册(系统提供的特定的一系列相册,例如:最近删除,视频列表,收藏等等,如下图所示)。
PHImageManager: 用于处理资源的加载,加载图片的过程带有缓存处理,可以通过传入一个 PHImageRequestOptions 控制资源的输出尺寸等规格。
PHImageRequestOptions: 如上面所说,控制加载图片时的一系列参数。
typedef NS_ENUM(NSInteger, PHAssetCollectionType) {
PHAssetCollectionTypeAlbum = 1,//从 iTunes 同步来的相册,以及用户在 Photos 中自己建立的相册(2-101)
PHAssetCollectionTypeSmartAlbum = 2,//经由相机得来的相册(200-211)
PHAssetCollectionTypeMoment = 3,//Photos 为我们自动生成的时间分组的相册
} PHOTOS_ENUM_AVAILABLE_IOS_TVOS(8_0, 10_0);
/*
之前看过几个篇其他的文章,有些人可能对PHAssetCollectionTypeAlbum(Albums can be created in the Photos app or appear on an iOS device through iTunes sync)
和PHAssetCollectionTypeSmartAlbum(The Photos app displays built-in smart albums to group certain kinds of related assets)有些迷惑,我们只要看苹果的API的描述就可以了。
PHAssetCollectionTypeAlbum是从iTunes同步或者用户自己在Photo App中建立的相册,它是可以删除的;
PHAssetCollectionTypeSmartAlbum是把各个文件夹中的相片,通过不同的约束条件进行分类的,属于系统的操作,你会发现系统的相册是不能删除的。
`PHAssetCollection` 类有个属性 `estimatedAssetCount`,可以用来快速获取该相册中的照片和视频的数量,但是在 PHAssetCollectionTypeSmartAlbum 上该属性永远为一个很大的数字(0),
这个苹果官方API也有描述:`This count may not match the current number of assets in the collection. To get the most recent count, fetch the collection’s assets with the fetchAssetsInAssetCollection:options: method and read the count property of the fetch result.
If asset count information is not available for the collection, this property’s value is NSNotFound.`
`estimatedAssetCount`只能初略的统计相册和视频的数量,对于动态变化的相册是不能统计的,要用其他的方法去计算数量。
*/
typedef NS_ENUM(NSInteger, PHAssetCollectionSubtype) {
// PHAssetCollectionTypeAlbum regular subtypes
PHAssetCollectionSubtypeAlbumRegular = 2,//用户在 Photos 中创建的相册,也就是我所谓的逻辑相册
PHAssetCollectionSubtypeAlbumSyncedEvent = 3,//使用 iTunes 从 Photos 照片库或者 iPhoto 照片库同步过来的事件。然而,在iTunes 12 以及iOS 9.0 beta4上,选用该类型没法获取同步的事件相册,而必须使用AlbumSyncedAlbum。
PHAssetCollectionSubtypeAlbumSyncedFaces = 4,//使用 iTunes 从 Photos 照片库或者 iPhoto 照片库同步的人物相册。
PHAssetCollectionSubtypeAlbumSyncedAlbum = 5,//做了 AlbumSyncedEvent 应该做的事
PHAssetCollectionSubtypeAlbumImported = 6,//从相机或是外部存储导入的相册,完全没有这方面的使用经验,没法验证。
// PHAssetCollectionTypeAlbum shared subtypes
PHAssetCollectionSubtypeAlbumMyPhotoStream = 100,//用户的 iCloud 照片流
PHAssetCollectionSubtypeAlbumCloudShared = 101, //用户使用 iCloud 共享的相册
// PHAssetCollectionTypeSmartAlbum subtypes
PHAssetCollectionSubtypeSmartAlbumGeneric = 200,//文档解释为非特殊类型的相册,主要包括从 iPhoto 同步过来的相册。由于本人的 iPhoto 已被 Photos 替代,无法验证。不过,在我的 iPad mini 上是无法获取的,而下面类型的相册,尽管没有包含照片或视频,但能够获取到。
PHAssetCollectionSubtypeSmartAlbumPanoramas = 201,//相机拍摄的全景照片
PHAssetCollectionSubtypeSmartAlbumVideos = 202,//相机拍摄的视频
PHAssetCollectionSubtypeSmartAlbumFavorites = 203,//收藏文件夹
PHAssetCollectionSubtypeSmartAlbumTimelapses = 204,//延时视频文件夹,同时也会出现在视频文件夹中
PHAssetCollectionSubtypeSmartAlbumAllHidden = 205,//包含隐藏照片或视频的文件夹
PHAssetCollectionSubtypeSmartAlbumRecentlyAdded = 206,//相机近期拍摄的照片或视频
PHAssetCollectionSubtypeSmartAlbumBursts = 207,//连拍模式拍摄的照片,在 iPad mini 上按住快门不放就可以了,但是照片依然没有存放在这个文件夹下,而是在相机相册里。
PHAssetCollectionSubtypeSmartAlbumSlomoVideos = 208,//Slomo 是 slow motion 的缩写,高速摄影慢动作解析,在该模式下,iOS 设备以120帧拍摄。不过我的 iPad mini 不支持,没法验证。
PHAssetCollectionSubtypeSmartAlbumUserLibrary = 209,//这个命名最神奇了,就是相机相册,所有相机拍摄的照片或视频都会出现在该相册中,而且使用其他应用保存的照片也会出现在这里。
PHAssetCollectionSubtypeSmartAlbumSelfPortraits PHOTOS_AVAILABLE_IOS_TVOS(9_0, 10_0) = 210,//前置摄像头所拍摄的所有照片和视频
PHAssetCollectionSubtypeSmartAlbumScreenshots PHOTOS_AVAILABLE_IOS_TVOS(9_0, 10_0) = 211,//所有的截图
// Used for fetching, if you don't care about the exact subtype
PHAssetCollectionSubtypeAny = NSIntegerMax//包含所有类型
} PHOTOS_ENUM_AVAILABLE_IOS_TVOS(8_0, 10_0);
NSMutableArray *dataArray = [NSMutableArray array];
PHFetchOptions *fetchOptions = [[PHFetchOptions alloc]init];
//检索的结果,subtype如果不选或者选错,系统会选择默认的类型
PHFetchResult *smartAlbumsFetchResult = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeSmartAlbum subtype:PHAssetCollectionSubtypeSmartAlbumUserLibrary options:fetchOptions];
//遍历相机胶卷
[smartAlbumsFetchResult enumerateObjectsUsingBlock:^(PHAssetCollection * _Nonnull collection, NSUInteger idx, BOOL *stop) {
//过滤视频,只剩下相册
if (![collection.localizedTitle isEqualToString:@"Videos"]) {
}
}];
//遍历自定义相册
PHFetchResult *smartAlbumsFetchResult1 = [PHAssetCollection fetchTopLevelUserCollectionsWithOptions:fetchOptions];
[smartAlbumsFetchResult1 enumerateObjectsUsingBlock:^(PHAssetCollection * _Nonnull collection, NSUInteger idx, BOOL *stop) {
//遍历返回的结果
}];
***未完持续更新*****