簡(jiǎn)介:Photos框架是iOS8.0后推出的一個(gè)新的用于對(duì)系統(tǒng)相冊(cè)進(jìn)行相關(guān)操作的河绽,在iOS8.0之前筝野,開(kāi)發(fā)中只能使用AssetsLibrary框架來(lái)訪問(wèn)移動(dòng)設(shè)備的圖片庫(kù)。本文中不再對(duì)AssetsLibrary做過(guò)多的介紹,僅針對(duì)Photos框架進(jìn)行詳細(xì)介紹。并且以美圖秀秀的照片選擇器作為實(shí)例載體進(jìn)行功能實(shí)現(xiàn)晾虑。
首先要獲取系統(tǒng)的所有相冊(cè),有多個(gè)方法可以選擇
1.該方法通過(guò)唯一標(biāo)識(shí)符identifiers來(lái)獲取相冊(cè) ?PHFetchOptions為將要獲取到了相冊(cè)的相關(guān)屬性對(duì)象
+ (PHFetchResult *)fetchAssetCollectionsWithLocalIdentifiers:(NSArray *)identifiers options:(nullable PHFetchOptions *)options;
2.該方法通過(guò)PHAssetCollectionType 相冊(cè)分類枚舉值獲取相關(guān)相冊(cè)?PHAssetCollectionSubtype?為子類型 即進(jìn)一步想相冊(cè)分類 ?如Album和 AlbumCoundShared組合表示從iTunes同步來(lái)的 并且是從icloud分享來(lái)的相冊(cè)
+ (PHFetchResult *)fetchAssetCollectionsWithType:(PHAssetCollectionType)type subtype:(PHAssetCollectionSubtype)subtype options:(nullable PHFetchOptions *)options;
相關(guān)枚舉值如下
typedef NS_ENUM(NSInteger, PHAssetCollectionType) {
PHAssetCollectionTypeAlbum= 1, //從iTunes同步而來(lái)的及用戶自建的相冊(cè)
PHAssetCollectionTypeSmartAlbum = 2,//相機(jī)拍攝而成的相冊(cè)
PHAssetCollectionTypeMoment= 3,//Photos為我們自動(dòng)生成的時(shí)間分組相冊(cè)
}
enumPHAssetCollectionSubtype : Int {
caseAlbumRegular//用戶在 Photos 中創(chuàng)建的相冊(cè)仅叫,也就是我所謂的邏輯相冊(cè)
caseAlbumSyncedEvent//使用 iTunes 從 Photos 照片庫(kù)或者 iPhoto 照片庫(kù)同步過(guò)來(lái)的事件帜篇。然而,在iTunes 12 以及iOS 9.0 beta4上诫咱,選用該類型沒(méi)法獲取同步的事件相冊(cè)笙隙,而必須使用AlbumSyncedAlbum。
caseAlbumSyncedFaces//使用 iTunes 從 Photos 照片庫(kù)或者 iPhoto 照片庫(kù)同步的人物相冊(cè)遂跟。
caseAlbumSyncedAlbum//做了 AlbumSyncedEvent 應(yīng)該做的事
caseAlbumImported//從相機(jī)或是外部存儲(chǔ)導(dǎo)入的相冊(cè),完全沒(méi)有這方面的使用經(jīng)驗(yàn)婴渡,沒(méi)法驗(yàn)證幻锁。
caseAlbumMyPhotoStream//用戶的 iCloud 照片流
caseAlbumCloudShared//用戶使用 iCloud 共享的相冊(cè)
caseSmartAlbumGeneric//文檔解釋為非特殊類型的相冊(cè),主要包括從 iPhoto 同步過(guò)來(lái)的相冊(cè)边臼。由于本人的 iPhoto 已被 Photos 替代哄尔,無(wú)法驗(yàn)證。不過(guò)柠并,在我的 iPad mini 上是無(wú)法獲取的岭接,而下面類型的相冊(cè),盡管沒(méi)有包含照片或視頻臼予,但能夠獲取到鸣戴。
caseSmartAlbumPanoramas//相機(jī)拍攝的全景照片
caseSmartAlbumVideos//相機(jī)拍攝的視頻
caseSmartAlbumFavorites//收藏文件夾
caseSmartAlbumTimelapses//延時(shí)視頻文件夾,同時(shí)也會(huì)出現(xiàn)在視頻文件夾中
caseSmartAlbumAllHidden//包含隱藏照片或視頻的文件夾
caseSmartAlbumRecentlyAdded//相機(jī)近期拍攝的照片或視頻
caseSmartAlbumBursts//連拍模式拍攝的照片粘拾,在 iPad mini 上按住快門不放就可以了窄锅,但是照片依然沒(méi)有存放在這個(gè)文件夾下,而是在相機(jī)相冊(cè)里缰雇。
caseSmartAlbumSlomoVideos//Slomo 是 slow motion 的縮寫入偷,高速攝影慢動(dòng)作解析,在該模式下械哟,iOS 設(shè)備以120幀拍攝疏之。不過(guò)我的 iPad mini 不支持,沒(méi)法驗(yàn)證暇咆。
caseSmartAlbumUserLibrary//這個(gè)命名最神奇了锋爪,就是相機(jī)相冊(cè)丙曙,所有相機(jī)拍攝的照片或視頻都會(huì)出現(xiàn)在該相冊(cè)中,而且使用其他應(yīng)用保存的照片也會(huì)出現(xiàn)在這里几缭。
caseAny//包含所有類型
}
3.該方法也是通過(guò)相冊(cè)分類進(jìn)行查詢 用法同上
// Smart Albums are not supported, only Albums and Moments
+ (PHFetchResult *)fetchAssetCollectionsContainingAsset:(PHAsset *)asset withType:(PHAssetCollectionType)type options:(nullable PHFetchOptions *)options;
4.該方法通過(guò)管理iOS8.0之前的AssetsLibrary的唯一標(biāo)識(shí)URL
+ (PHFetchResult *)fetchAssetCollectionsWithALAssetGroupURLs:(NSArray *)assetGroupURLs options:(nullable PHFetchOptions *)options;
還有幾個(gè)獲取系統(tǒng)相冊(cè)的方法 ?用法類似 在此不再描述河泳。
獲取相冊(cè)后,我們需要遍歷每一個(gè)相冊(cè)年栓,獲取具體的照片內(nèi)容拆挥,下面將介紹幾個(gè)常用的方法。
首先介紹一下PHFetchResult類某抓,該類實(shí)例對(duì)象既可以表示一個(gè)相冊(cè)集合纸兔,也可以表示具體的照片集合,就像文件夾一樣否副,文件夾下既可以是文件夾汉矿,也可以是具體的文件,因此备禀,我們用它來(lái)描述以上獲取的相冊(cè)集合洲拇,同樣也會(huì)用它描述具體的照片集合。
當(dāng)我們通過(guò)以上方法獲取到相冊(cè)集合后曲尸,應(yīng)當(dāng)遍歷PHFetchResult對(duì)象(類似數(shù)組赋续,操作與數(shù)組相同,只是存儲(chǔ)的數(shù)據(jù)類型為PHAssetCollection對(duì)象)另患,如下獲取某一個(gè)相冊(cè)集合下的具體一個(gè)相冊(cè)(具體相冊(cè)即為照片集合):
PHFetchResult *result = [PHAsset fetchAssetsInAssetCollection:(PHAssetCollection對(duì)象) options:nil];
如下方法進(jìn)行了某一個(gè)具體的相冊(cè)查詢纽乱,其中由于當(dāng)前result為相冊(cè)對(duì)象,因此獲取的圖片為相冊(cè)封面照片昆箕,targetSize為目標(biāo)照片的尺寸鸦列,該框架會(huì)提供一張你指定的尺寸照片,以達(dá)到提升性能的目的鹏倘,如果缺省會(huì)返回原尺寸大小的照片(可能會(huì)占用較大內(nèi)存薯嗤,不建議這樣做哦)。PHImageRequestOptions為照片尺寸的拉伸模式纤泵。PHImageRequestOptions參數(shù)為照片的獲取配置应民,如果需要從iCloud下載圖片,可以詳細(xì)配置夕吻,一般使用默認(rèn)配置即可诲锹。回調(diào)block中提供了UIImage對(duì)象和照片信息字典涉馅。
PHFetchResult *assetResult = [PHAsset fetchAssetsInAssetCollection:collection options:nil];
[[PHImageManager defaultManager] requestImageForAsset:assetResult.firstObject targetSize:_coverImgView.frame.size contentMode:PHImageContentModeDefault options:[PHImageRequestOptionsnew] resultHandler:^(UIImage * _Nullable result, NSDictionary * _Nullable info) {
_coverImgView.image = result;
}];
以上即為整體美圖照片選擇器所使用到的Photos框架基本技術(shù)归园,如下為具體的核心代碼。
/*相冊(cè)配置使用默認(rèn)即可*/
PHFetchOptions *fetchOptions = [PHFetchOptionsnew];
/*初始化相冊(cè)數(shù)組*/
_deviceAlumDataArr = [NSMutableArray array];
/* 獲取系統(tǒng)創(chuàng)建的相冊(cè) */
PHFetchResult *smartAlbumFetchResult = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeSmartAlbum subtype:PHAssetCollectionSubtypeAny options:fetchOptions];
_allAblubResult = smartAlbumFetchResult;
/*遍歷系統(tǒng)創(chuàng)建相冊(cè)結(jié)果集*/
for(PHAssetCollection *subinsmartAlbumFetchResult) {
PHFetchResult *result = [PHAsset fetchAssetsInAssetCollection:sub options:nil];
if(result.count==0) {
continue;
}
/*添加具體相冊(cè)到相冊(cè)數(shù)組*/
[_deviceAlumDataArr addObject:sub];
}
/*獲取所有的用戶創(chuàng)建相冊(cè)*/
PHFetchResult *smartAlbumFetchResult2 = [PHAssetCollection fetchTopLevelUserCollectionsWithOptions:nil];
/*遍歷用戶自建相冊(cè)結(jié)果集*/
for(PHAssetCollection *subinsmartAlbumFetchResult2) {
PHFetchResult *result = [PHAsset fetchAssetsInAssetCollection:sub options:nil];
if(result.count==0) {
continue;
}
/*添加具體相冊(cè)到相冊(cè)數(shù)組*/
[_deviceAlumDataArr addObject:sub];
}
效果圖如下:如果有朋友需要源碼稚矿,可以到github上面下載哦庸诱,喜歡的話記得start??:https://github.com/China131/JHM_TShow.git