該框架在圖片app中用來管理圖片和音視頻文件淹冰,用來一部查找和緩存資源或者縮略圖叮喳、修復(fù)內(nèi)容和在不同設(shè)備間同步圖片等資源被芳。
先簡單的了解一些概念:
- PHAsset:單個(gè)資源
- PHAssetCollection:PHCollection的子類,單個(gè)資源的集合馍悟,如相冊畔濒、時(shí)刻等
- PHCollectionList:PHCollection的子類,集合的集合锣咒,如相冊文件夾
- PHPhotoLibrary:類似于總管理侵状,負(fù)責(zé)注冊通知、檢查和請求獲取權(quán)限
- PHImageManager:按照要求獲取制定的圖片
- PHCachingImageManager:PHImageManager的子類
- PHAssetChangeRequest:編輯相冊毅整,增刪改查
下面一一做盡可能詳盡的說明
*PHCollection
在進(jìn)行下面的實(shí)驗(yàn)之前趣兄,先簡單的說說該類中的一個(gè)方法:
+ (PHFetchResult<PHCollection *> *)fetchTopLevelUserCollectionsWithOptions:(nullable PHFetchOptions *)options;
該方法用來獲取處于圖片app中根目錄下的自己創(chuàng)建的相冊(貌似自己創(chuàng)建的本身就在根目錄下)
1、PHAssetCollection
一個(gè)該實(shí)例對象代表一個(gè)相冊毛嫉。是PHCollection的子類诽俯。
它的所有屬性都是只讀的,另外有8個(gè)類方法承粤,用來獲取想要的結(jié)果暴区。
-
+ (PHFetchResult<PHAssetCollection *> *)fetchAssetCollectionsWithType:(PHAssetCollectionType)type subtype:(PHAssetCollectionSubtype)subtype options:(nullable PHFetchOptions *)options;
該方法是該類的主要訪問方法,主要用于在未知相冊的情況下辛臊,直接通過type和subtype從相冊獲取相應(yīng)的相冊仙粱。type和subtype如下所示:
typedef NS_ENUM(NSInteger, PHAssetCollectionType) {
PHAssetCollectionTypeAlbum = 1, 相冊,系統(tǒng)外的
PHAssetCollectionTypeSmartAlbum = 2, 智能相冊彻舰,系統(tǒng)自己分配和歸納的
PHAssetCollectionTypeMoment = 3, 時(shí)刻伐割,系統(tǒng)自動(dòng)通過時(shí)間和地點(diǎn)生成的分組
} PHOTOS_ENUM_AVAILABLE_IOS_TVOS(8_0, 10_0);
*
* typedef NS_ENUM(NSInteger, PHAssetCollectionSubtype) {
// PHAssetCollectionTypeAlbum regular subtypes
PHAssetCollectionSubtypeAlbumRegular = 2, // 在iPhone中自己創(chuàng)建的相冊
PHAssetCollectionSubtypeAlbumSyncedEvent = 3, // 從iPhoto(就是現(xiàn)在的圖片app)中導(dǎo)入圖片到設(shè)備
PHAssetCollectionSubtypeAlbumSyncedFaces = 4, // 從圖片app中導(dǎo)入的人物照片
PHAssetCollectionSubtypeAlbumSyncedAlbum = 5, // 從圖片app導(dǎo)入的相冊
PHAssetCollectionSubtypeAlbumImported = 6, // 從其他的相機(jī)或者存儲設(shè)備導(dǎo)入的相冊
// PHAssetCollectionTypeAlbum shared subtypes
PHAssetCollectionSubtypeAlbumMyPhotoStream = 100, // 照片流,照片流和iCloud有關(guān)刃唤,如果在設(shè)置里關(guān)閉了iCloud開關(guān)隔心,就獲取不到了
PHAssetCollectionSubtypeAlbumCloudShared = 101, // iCloud的共享相冊,點(diǎn)擊照片上的共享tab創(chuàng)建后就能拿到了尚胞,但是前提是你要在設(shè)置中打開iCloud的共享開關(guān)(打開后才能看見共享tab)
// PHAssetCollectionTypeSmartAlbum subtypes
PHAssetCollectionSubtypeSmartAlbumGeneric = 200,
PHAssetCollectionSubtypeSmartAlbumPanoramas = 201, // 全景圖硬霍、全景照片
PHAssetCollectionSubtypeSmartAlbumVideos = 202, // 視頻
PHAssetCollectionSubtypeSmartAlbumFavorites = 203, // 標(biāo)記為喜歡、收藏
PHAssetCollectionSubtypeSmartAlbumTimelapses = 204, // 延時(shí)拍攝笼裳、定時(shí)拍攝
PHAssetCollectionSubtypeSmartAlbumAllHidden = 205, // 隱藏的
PHAssetCollectionSubtypeSmartAlbumRecentlyAdded = 206, // 最近添加的唯卖、近期添加
PHAssetCollectionSubtypeSmartAlbumBursts = 207, // 連拍
PHAssetCollectionSubtypeSmartAlbumSlomoVideos = 208, // Slow Motion,高速攝影慢動(dòng)作(概念不懂)
PHAssetCollectionSubtypeSmartAlbumUserLibrary = 209, // 相機(jī)膠卷
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, // 在可兼容的設(shè)備上使用景深攝像模式拍的照片(概念不懂)
PHAssetCollectionSubtypeSmartAlbumLivePhotos PHOTOS_AVAILABLE_IOS_TVOS(10_3, 10_2) = 213, // Live Photo資源
PHAssetCollectionSubtypeSmartAlbumAnimated PHOTOS_AVAILABLE_IOS_TVOS(11_0, 11_0) = 214, // 沒有解釋
PHAssetCollectionSubtypeSmartAlbumLongExposures PHOTOS_AVAILABLE_IOS_TVOS(11_0, 11_0) = 215, // 沒有解釋
// 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 *> *)fetchAssetCollectionsWithLocalIdentifiers:(NSArray<NSString *> *)identifiers options:(nullable PHFetchOptions *)options;
通過identifier的數(shù)組來查找到相應(yīng)的資源,不過這里的identifier應(yīng)使用上面的方法獲取到相冊后拿到的相冊的identifier(根據(jù)屬性localIdentifier即可獲取到)躬柬,否則會得到意想不到的結(jié)果拜轨。測試代碼如下:
- (IBAction)fetchCollectionWithIdentifier:(id)sender {
// 先試試用圖片的identifier
NSMutableArray * assetIdentifierArr = [NSMutableArray array];
NSMutableArray * identifierArr = [NSMutableArray array];
PHFetchResult<PHAssetCollection *> * result = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeAlbum subtype:PHAssetCollectionSubtypeAlbumRegular options:nil];
[result enumerateObjectsUsingBlock:^(PHAssetCollection * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
if (obj.localIdentifier.length > 0) {
NSLog(@"%@--%@", obj.localIdentifier, obj.localizedTitle);
[identifierArr addObject:obj.localIdentifier];
PHFetchResult<PHAsset *> * assetResult = [PHAsset fetchAssetsInAssetCollection:obj options:nil];
PHAsset * asset = assetResult.firstObject;
[assetIdentifierArr addObject:asset.localIdentifier];
}
}];
// 注意:這里使用的是單個(gè)資源的identifier
PHFetchResult<PHAssetCollection *> * assetIdentifierResult = [PHAssetCollection fetchAssetCollectionsWithLocalIdentifiers:assetIdentifierArr options:nil];
[assetIdentifierResult enumerateObjectsUsingBlock:^(PHAssetCollection * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
if (obj.localIdentifier.length > 0) {
NSLog(@"%@", obj);
}
}];
NSLog(@"================================");
// 注意:這里使用的是相冊的identifier
PHFetchResult<PHAssetCollection *> * identifierResult = [PHAssetCollection fetchAssetCollectionsWithLocalIdentifiers:identifierArr options:nil];
[identifierResult enumerateObjectsUsingBlock:^(PHAssetCollection * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
if (obj.localIdentifier.length > 0) {
NSLog(@"%@", obj);
}
}];
}
可以先預(yù)想一下結(jié)果,然后再看下面的截圖:上面的使用也再一次的證明了identifier一定要使用代碼獲取到的才行允青。
-
+ (PHFetchResult<PHAssetCollection *> *)fetchAssetCollectionsContainingAsset:(PHAsset *)asset withType:(PHAssetCollectionType)type options:(nullable PHFetchOptions *)options;
查找包含資源asset的相冊 -
+ (PHFetchResult<PHAssetCollection *> *)fetchAssetCollectionsWithALAssetGroupURLs:(NSArray<NSURL *> *)assetGroupURLs options:(nullable PHFetchOptions *)options;
舊版的圖片框架和新版框架的交互橄碾,不過到了今天,已經(jīng)基本上不用考慮該方法的調(diào)用了。 + (PHFetchResult<PHAssetCollection *> *)fetchMomentsInMomentList:(PHCollectionList *)momentList options:(nullable PHFetchOptions *)options;
-
+ (PHFetchResult<PHAssetCollection *> *)fetchMomentsWithOptions:(nullable PHFetchOptions *)options;
上面的兩個(gè)方法是獲取Moment相冊的簡單方法 + (PHAssetCollection *)transientAssetCollectionWithAssets:(NSArray<PHAsset *> *)assets title:(nullable NSString *)title;
-
+ (PHAssetCollection *)transientAssetCollectionWithAssetFetchResult:(PHFetchResult<PHAsset *> *)fetchResult title:(nullable NSString *)title;
利用已知資源創(chuàng)建一個(gè)新的集合或者說相冊堪嫂,但是該相冊不會被永久存儲下來偎箫。具體的使用后面再說吧。
2皆串、PHCollectionList
該類用來表示集合的集合淹办。但是我并沒有發(fā)現(xiàn)怎么創(chuàng)建出該現(xiàn)象。而如果不創(chuàng)建(假如可以創(chuàng)建但是沒創(chuàng)建)時(shí)恶复,在實(shí)際的調(diào)用中怜森,得到的結(jié)果和預(yù)想的也不一樣,有些困惑谤牡,所以副硅,這一節(jié)暫時(shí)先放放吧。
3翅萤、PHAsset
該類表示具體的資源信息恐疲,如寬度、高度套么、時(shí)長培己、是否是收藏的等等。同上面提到的幾個(gè)類一樣胚泌,該類的屬性也都是只讀的省咨,所以我們主要是用它的方法來獲取資源。
-
- (BOOL)canPerformEditOperation:(PHAssetEditOperation)editOperation;
用來判斷該資源是否可以做某些操作玷室,比如增刪改查零蓉。也從另一個(gè)方面暗示了,在對該資源做一些操作之前有必要先做一下判斷穷缤,這可以省去一些不必要的麻煩敌蜂。 -
+ (PHFetchResult<PHAsset *> *)fetchAssetsInAssetCollection:(PHAssetCollection *)assetCollection options:(nullable PHFetchOptions *)options;
該方法是從相冊中獲取單個(gè)資源的主要途徑:
- (IBAction)useToFetchCollection:(id)sender {
// 先獲取到集合
PHFetchResult<PHAssetCollection *> * collectionResult = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeSmartAlbum subtype:PHAssetCollectionSubtypeSmartAlbumFavorites options:nil];
if (collectionResult.count == 0) {
return;
}
// 遍歷集合,獲取信息
[collectionResult enumerateObjectsUsingBlock:^(PHAssetCollection * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
PHFetchResult<PHAsset *> * assetResult = [PHAsset fetchAssetsInAssetCollection:obj options:nil];
NSLog(@"%@", assetResult);
}];
}
-
+ (PHFetchResult<PHAsset *> *)fetchAssetsWithLocalIdentifiers:(NSArray<NSString *> *)identifiers options:(nullable PHFetchOptions *)options;
該方法的使用和PHAssetCollection的相同津肛,是個(gè)查找功能紊册;如果identifier是隱藏的資源,默認(rèn)是會被找到的快耿,如果不想找到隱藏的,可以通過options的屬性includeHiddenAssets來設(shè)置(貌似沒什么用)芳绩。 -
+ (PHFetchResult<PHAsset *> *)fetchAssetsWithBurstIdentifier:(NSString *)burstIdentifier options:(nullable PHFetchOptions *)options;
根據(jù)identifier獲取連拍資源掀亥,如果傳遞的identifier不是連拍資源的identifier,即使相冊里有匹配的資源妥色,也不會返回搪花。不過蘋果官方說明:默認(rèn)只會獲取一些具有代表性的,如果想獲取全部的連拍資源,需要在options里做處理撮竿。 -
+ (PHFetchResult<PHAsset *> *)fetchAssetsWithOptions:(nullable PHFetchOptions *)options;
在相機(jī)膠卷中根據(jù)options來獲取合適的資源 -
+ (PHFetchResult<PHAsset *> *)fetchAssetsWithMediaType:(PHAssetMediaType)mediaType options:(nullable PHFetchOptions *)options;
在相機(jī)膠卷中根據(jù)mediaType媒體類型和options獲取匹配的資源 -
+ (nullable PHFetchResult<PHAsset *> *)fetchKeyAssetsInAssetCollection:(PHAssetCollection *)assetCollection options:(nullable PHFetchOptions *)options;
獲取相冊資源的封面圖吮便,根據(jù)相冊類型的不同,返回的資源封面的個(gè)數(shù)也不同幢踏。
如果是零時(shí)的相冊髓需,是沒有封面的。