Photos對(duì)應(yīng)的基本概念
PHFetchResult -> PHCollectionList ->PHCollection -> PHAssetCollection -> PHAsset -> PHImageManager
PHAsset表示相冊(cè)里的一個(gè)資源,如一張圖片或者一個(gè)視頻。
PHAssetCollection表示一個(gè)相冊(cè)或者時(shí)刻,可以是系統(tǒng)相冊(cè)或者用戶自定義的相冊(cè),PHCollection是它的父類。
PHCollectionList表示多個(gè)相冊(cè)PHCollection的集合。
PHFetchResult是調(diào)用了PhotoKit提供的資源請(qǐng)求接口如fetchAssetCollectionsWithType函數(shù),返回的請(qǐng)求結(jié)果,PHFetchResult是一個(gè)數(shù)組,里面的元素可以是PHAsset,也可以是PHCollection,在請(qǐng)求的使用可以用PHFetchOptions定義請(qǐng)求參數(shù),比如只請(qǐng)求視頻類型或者圖片類型,請(qǐng)求結(jié)果的排序方式等。
PHImageManager是對(duì)一個(gè)PHAsset進(jìn)行請(qǐng)求以獲取資源數(shù)據(jù)的接口,PHAsset里面只是資源的元數(shù)據(jù),如圖片信息,圖片大小和創(chuàng)建日期等,當(dāng)你要把圖片load出來的時(shí)候就要用到PHImageManager的requestImageForAsset來進(jìn)行加載,可以通過參數(shù)來設(shè)置加載圖片的大小尺寸等,另外使用PHCachingImageManager還可以進(jìn)行緩存加載。
獲取所有相冊(cè)
1,獲取系統(tǒng)相冊(cè)
獲取到系統(tǒng)所有的相冊(cè)
PHFetchResult *smartAlbums = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeSmartAlbum subtype:PHAssetCollectionSubtypeAny options:nil];
typedef NS_ENUM(NSInteger, PHAssetCollectionType) {
PHAssetCollectionTypeAlbum = 1, //從 iTunes 同步來的相冊(cè),以及用戶在Photos中自己創(chuàng)建的相冊(cè)
PHAssetCollectionTypeSmartAlbum = 2, //經(jīng)由相機(jī)得來的相冊(cè)
PHAssetCollectionTypeMoment = 3, //Photos 為我們自動(dòng)生成的時(shí)間分組的相冊(cè)
} PHOTOS_ENUM_AVAILABLE_IOS_TVOS(8_0, 10_0);
typedef NS_ENUM(NSInteger, PHAssetCollectionSubtype) {
// PHAssetCollectionTypeAlbum regular subtypes
PHAssetCollectionSubtypeAlbumRegular = 2, //用戶在 Photos 中創(chuàng)建的相冊(cè)
PHAssetCollectionSubtypeAlbumSyncedEvent = 3, /使用 iTunes 從 Photos 照片庫或者 iPhoto 照片庫同步過來的事件。
PHAssetCollectionSubtypeAlbumSyncedFaces = 4, //使用 iTunes 從 Photos 照片庫或者 iPhoto 照片庫同步的人物相冊(cè)。
PHAssetCollectionSubtypeAlbumSyncedAlbum = 5, //做了 AlbumSyncedEvent 應(yīng)該做的事
PHAssetCollectionSubtypeAlbumImported = 6, //從相機(jī)或是外部存儲(chǔ)導(dǎo)入的相冊(cè)
// PHAssetCollectionTypeAlbum shared subtypes
PHAssetCollectionSubtypeAlbumMyPhotoStream = 100, //用戶的 iCloud 照片流
PHAssetCollectionSubtypeAlbumCloudShared = 101, //用戶使用 iCloud 共享的相冊(cè)
// PHAssetCollectionTypeSmartAlbum subtypes
PHAssetCollectionSubtypeSmartAlbumGeneric = 200, //文檔解釋為非特殊類型的相冊(cè),主要包括從 iPhoto 同步過來的相冊(cè)
PHAssetCollectionSubtypeSmartAlbumPanoramas = 201, //相機(jī)拍攝的全景照片
PHAssetCollectionSubtypeSmartAlbumVideos = 202, //相機(jī)拍攝的視頻
PHAssetCollectionSubtypeSmartAlbumFavorites = 203, //收藏文件夾
PHAssetCollectionSubtypeSmartAlbumTimelapses = 204, //延時(shí)視頻文件夾,同時(shí)也會(huì)出現(xiàn)在視頻文件夾中
PHAssetCollectionSubtypeSmartAlbumAllHidden = 205, //包含隱藏照片或視頻的文件夾
PHAssetCollectionSubtypeSmartAlbumRecentlyAdded = 206, //相機(jī)近期拍攝的照片或視頻
PHAssetCollectionSubtypeSmartAlbumBursts = 207, //連拍模式拍攝的照片
PHAssetCollectionSubtypeSmartAlbumSlomoVideos = 208, //Slomo 是 slow motion 的縮寫,高速攝影慢動(dòng)作解析,在該模式下,iOS 設(shè)備以120幀拍攝。
PHAssetCollectionSubtypeSmartAlbumUserLibrary = 209, //這個(gè)命名最神奇了,就是相機(jī)相冊(cè),所有相機(jī)拍攝的照片或視頻都會(huì)出現(xiàn)在該相冊(cè)中,而且使用其他應(yīng)用保存的照片也會(huì)出現(xiàn)在這里。
PHAssetCollectionSubtypeSmartAlbumSelfPortraits PHOTOS_AVAILABLE_IOS_TVOS(9_0, 10_0) = 210, //這個(gè)相冊(cè)包含了用戶使用前置攝像頭拍攝的照片和視頻
PHAssetCollectionSubtypeSmartAlbumScreenshots PHOTOS_AVAILABLE_IOS_TVOS(9_0, 10_0) = 211, //使用設(shè)備的截屏功能生成的照片
PHAssetCollectionSubtypeSmartAlbumDepthEffect PHOTOS_AVAILABLE_IOS_TVOS(10_2, 10_1) = 212, //在可兼容的設(shè)備上使用景深攝像模式拍的照片
PHAssetCollectionSubtypeSmartAlbumLivePhotos PHOTOS_AVAILABLE_IOS_TVOS(10_3, 10_2) = 213, //包含所有的Live Photo資源
PHAssetCollectionSubtypeSmartAlbumAnimated PHOTOS_AVAILABLE_IOS_TVOS(11_0, 11_0) = 214, //動(dòng)圖
PHAssetCollectionSubtypeSmartAlbumLongExposures PHOTOS_AVAILABLE_IOS_TVOS(11_0, 11_0) = 215, //長(zhǎng)曝光
// Used for fetching, if you don't care about the exact subtype
PHAssetCollectionSubtypeAny = NSIntegerMax ////包含所有類型
} PHOTOS_ENUM_AVAILABLE_IOS_TVOS(8_0, 10_0);
注意,獲取指定類型的相冊(cè)時(shí),主類型和子類型要匹配,不要串臺(tái)。如果不匹配,系統(tǒng)會(huì)按照 Any 子類型來處理。對(duì)于 Moment 類型,子類型使用 Any。
拿到系統(tǒng)相冊(cè)信息
[smartAlbums enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
PHAssetCollection *colletion = obj;
[smartArray addObject:colletion];
}]
2,獲取用戶自定義的相冊(cè)
獲取自定義相冊(cè)
PHFetchResult *userAlbums = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeAlbum subtype:PHAssetCollectionSubtypeAny options:nil];
獲取自定義相冊(cè)信息:
[userAlbums enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
PHAssetCollection *colletion = obj;
[smartArray addObject:colletion];
}];
獲取具體的視頻或者圖片信息
先獲取具體的一個(gè)相冊(cè)
PHAssetCollection *collection = [smartArray objectAtIndex:i];
PHFetchResult *result = [PHAsset fetchAssetsInAssetCollection:collection options:nil];
獲取具體相冊(cè)里面的信息
PHAsset *asset = result[I];
信息展示
我們要通過PHCachingImageManager去獲取縮略圖
[self.imageManager requestImageForAsset: PHAsset targetSize:CELLSIZE contentMode:PHImageContentModeAspectFit options:nil resultHandler:^(UIImage * _Nullable result, NSDictionary * _Nullable info) {
}]
獲取地址信息
__block NSString videoUrl = @"";
dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
[[PHImageManager defaultManager] requestAVAssetForVideo:asset
options:[PHVideoRequestOptions new] resultHandler:^(AVAsset * avAsset, AVAudioMix * audioMix, NSDictionary * info) {
videoUrl = ((AVURLAsset)avAsset).URL.absoluteString;
dispatch_semaphore_signal(semaphore);
}];
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
return videoUrl;