簡(jiǎn)介
Photos framework是iOS8蘋(píng)果提供的新的圖片框架熊咽,能直接獲取圖片和視頻,包括iCloud上面的圖庫(kù)鬼店。使用這個(gè)框架可以獲取assets來(lái)展示和回放网棍,編輯圖片或者視頻內(nèi)容,或者使用系統(tǒng)相冊(cè)妇智、時(shí)刻滥玷、和分享到iCloud的相冊(cè)來(lái)進(jìn)行相關(guān)操作,本文側(cè)重相片的獲取與保存巍棱。
demo地址在這里
新特性與一些概念
獲取實(shí)體&改變請(qǐng)求:
Photos framework中的三個(gè)model類(lèi):PHAsset
,PHAssetCollection
,PHCollectionList
惑畴,分別對(duì)應(yīng)三個(gè)類(lèi)型的實(shí)體:asset
(圖片和視頻),assets
集合(相冊(cè)和時(shí)刻),集合列表(相冊(cè)文件夾或者moment clusters)航徙。這些對(duì)象如贷,也成為 相片實(shí)體(photo entities),只包含元數(shù)據(jù),同時(shí)也是read-only
屬性杠袱。改變觀察機(jī)制:
使用這個(gè)特性能夠在其他app尚猿、設(shè)備更改了圖片和視頻內(nèi)容或者相冊(cè)的時(shí)候通知你的app,在實(shí)現(xiàn)觀察機(jī)制前需要用PHPhotoLibrary
對(duì)象先為你獲取到的照片實(shí)體注冊(cè)一個(gè)觀察者支持手機(jī)中的照片app的特性
使用PHCollectionList
類(lèi)查找獲取照片中響應(yīng)的時(shí)刻層級(jí)asset楣富,使用PHAsset
標(biāo)記連拍照片凿掂,全景照片和高分辨率視頻等。當(dāng)開(kāi)啟iCloud圖庫(kù)后纹蝴,Photo framework能從iCloud中獲取到使用相同apple ID登陸的不同設(shè)備中的照片庄萎。加載緩存asset和縮略圖
使用PHImageManager
請(qǐng)求asset中的特定尺寸的圖片或者通過(guò)AV Foundation 對(duì)象獲取video asset。Photos frame會(huì)根據(jù)設(shè)定自動(dòng)下載塘安,緩存糠涛,以便于高效復(fù)用。對(duì)于大量的assets的快速執(zhí)行兼犯,例如在生成相冊(cè)中所有圖片的縮略圖時(shí)忍捡,使用PHCachingImageManager
的子類(lèi)來(lái)實(shí)現(xiàn)。編輯asset內(nèi)容
PHAsset
和PHAsssetChangeRequest
定義了一些用于編輯照片或者視頻內(nèi)容的方法切黔,同時(shí)允許將編輯后的圖片保存到圖庫(kù)中锉罐。為了可以讓用戶(hù)可以在前次修改的基礎(chǔ)上再次修改,或者是在不同的app上進(jìn)行多次修改绕娘,Photos保存了當(dāng)前和縣區(qū)版本的asset,如果單獨(dú)使用PHAdjustMnentData
對(duì)象只能獲取到最后編輯的照片栽连。如果你的app支持在前面修改基礎(chǔ)上多次編輯险领,你應(yīng)該允許用戶(hù)撤回或者修改本次編輯。
framework中的類(lèi)
PHAdjustmentData
當(dāng)修改了一個(gè)asset后秒紧,Photos會(huì)將PHAdjustmentData
對(duì)象和修改過(guò)的圖片或者視頻數(shù)據(jù)一起保存起來(lái)绢陌,你可以通過(guò)這個(gè)對(duì)象提供的一些數(shù)據(jù)來(lái)修改已經(jīng)保存的編輯。
當(dāng)需要調(diào)整data的時(shí)候熔恢,調(diào)用
- (PHContentEditingInputRequestID)requestContentEditingInputWithOptions:(PHContentEditingInputRequestOptions *)options
completionHandler:(void (^)(PHContentEditingInput *contentEditingInput, NSDictionary *info))completionHandler
初始化方法:
/**
* 用于標(biāo)記特定的修改數(shù)據(jù)脐湾,使用formatIndentifier和formatVersion指定唯一的adjustment,
* data存儲(chǔ)用于回滾到之前狀態(tài)的數(shù)據(jù),也就是當(dāng)前圖片的修改數(shù)據(jù)叙淌,以便于在這個(gè)基礎(chǔ)上繼續(xù)進(jìn)行修改
*
* @param formatIndentifier 用于標(biāo)記 adjustment data
* @param formatVersion version number for adjustment data
* @param data 包含了重新修改需要的數(shù)據(jù)
*
*/
- (instanceType)initWithForamtIndentifier:(NSString *)formatIndentifier
formatVersion:(NSString *)formatVersion
data:(NSData *)data;
PHAssetChangeRequest
在圖庫(kù)中使用PHAssetChangeRequest
對(duì)象來(lái)創(chuàng)建秤掌,修改,刪除PHAsset
對(duì)象鹰霍。
可以使用適當(dāng)?shù)念?lèi)方法來(lái)實(shí)現(xiàn)增加刪除修改asset的目的:
/**
* 刪除給定的assets
*
* @param assets 包含需要?jiǎng)h除的asset數(shù)組
*/
+ (void)deleteAssets:(id<NSFastEnumeration>)assets;
/**
* 修改給定的PHAsset對(duì)象
*
* 在修改之前使用 'canPerformEditOperation:' 方法判斷asset是否允許修改
* 在photo library change block中創(chuàng)建修改請(qǐng)求后闻鉴,設(shè)置正確的修改請(qǐng)求屬性。
*
* @param asset 待修改的asset
*/
+ (instancetype)changeRequestForAsset:(PHAsset *)asset;
PHFetchOptions
當(dāng)你使用沒(méi)方法獲取PHAsset
(圖片和視頻),PHCollection
(相冊(cè)類(lèi)型),PHAssetCollection
(相冊(cè))的實(shí)體(相當(dāng)于包含多個(gè)數(shù)據(jù)的模型)使用PHFetchOptions
對(duì)象指定操作茂洒,例如獲取的實(shí)體的排列屬性等孟岛。
調(diào)用PHFetchRequest
類(lèi)方法創(chuàng)建一個(gè)包含fetch請(qǐng)求的對(duì)象。
這個(gè)類(lèi)包含了兩個(gè)屬性:predicate
和sortDescriptors
。
- NSPredicate *predicate:
specifies which properties to select results by and that also specifies any constraints on selection.
用于指定返回的結(jié)果和指定條件
示例:
PHFetchOperation *fetchOptions = [PHFetchOption new];
fetchOperations.predicate = [NSPredicate predicateWithFormat:
@"(mediaSubtype & %d) != 0 || (mediaSubtype & %d) != 0",
PHAssetMediaSubtypePhotoPanorama,PHAssetMediaSubtypeVideoHightFrameRate];
PHFetchResult *result = [PHAsset fetchAssetWithOptions:fetchOptions];
- NSArray <NSSortDescriptor *> *sortDescriptors
用于指定獲取的對(duì)象的順序
用一個(gè)例子實(shí)現(xiàn)以時(shí)間順序倒序(剛拍攝的照片放在前頭排列獲取圖片的功能:
PHFetchOption *option = [PHFetchOption new];
option.sourtDescriptors = @[NSSortDescriptors sortDescriptiorWithKey:@"creationDate" ascending:NO];
PHFetchResult *result = [PHAsset fetchAssetsWithOptions:option];
其他幾個(gè)屬性:
//用于確定app是否接收到了具體的改變信息渠羞。
@property(nonatomic, assign) BOOL wantsIncrementalChangeDetails
/**
*限制檢索獲取得到的photo實(shí)體的最小數(shù)量斤贰,當(dāng)實(shí)體數(shù)量十分巨大時(shí),作用顯著次询,
*例如荧恍,用'PHAsset'的'fetchAssetsWithOptions:'方法獲取最近拍攝的照片等。
*/
@property(nonatomic, assign, readwrite) NSUInteger fetchLimit
//檢索結(jié)果是否包含連拍圖片渗蟹,如果是NO块饺,只顯示用戶(hù)選取的那種圖片,如果為YES雌芽,
@property(nonatomic, assign) BOOL includeAllBurstAssets
//顧名思義授艰,是否檢索隱藏的圖片
@property(nonatomic, assign) BOOL includeHiddenAssets
/**
*包含的數(shù)據(jù)類(lèi)型:
*PHAssetSourceTypeUserLibrary
*PHAssetSourceTypeCloudShared
*PHAssetSourceTypeiTunesSynced
*/
@property(nonatomic, assign) PHAssetSourceType includeAssetSourceTypes
PHImageRequestOption
PHImageRequestOption 用于配置從PHImageManager中獲取asset的請(qǐng)求。
常用的一些屬性和方法有:
/**
* @discuss 如果是NO,表示為異步操作世落,從manager中請(qǐng)求圖片時(shí)淮腾,
* 'reqeustImageForAssets:targetSize:options:resultHandler'方法會(huì)立即返回,
* 建議在后臺(tái)只在后臺(tái)線程中執(zhí)行同步請(qǐng)求
*/
@property (nonatomic, assign) BOOL synchronous;
/**
*typedef : NSInteger {
PHImageRequestOptionsDeliveryModeOpportunistic = 0,
PHImageRequestOptionsDeliveryModeHighQualityFormat = 1,
PHImageRequestOptionsDeliveryModeFastFormat = 2,
} PHImageRequestOptionsDeliveryMode;
*@PHImageRequestOptionsDeliveryModeOpportunistic:
自動(dòng)返回一個(gè)或多個(gè)結(jié)果屉佳,來(lái)平衡圖片的質(zhì)量和響應(yīng)性谷朝,它會(huì)多次調(diào)用
resutltHandler:'requestImageForAssets:targetSize:options:resultHandler'.
它首先會(huì)先調(diào)用一次'resutltHandler'返回清晰度低的圖片作為臨時(shí)顯示圖片,
等到能獲取到高清晰度的圖片時(shí)再次調(diào)用'resutltHandler'返回高質(zhì)量圖片武花。
note:如果'synchronous'是NO那么該屬性無(wú)效
*@PHImageRequestOptionsDeliveryModeHighQualityFormat
只返回高分辨率的圖片圆凰。具有較高的優(yōu)先權(quán)
*@PHImageRequestOptionsDeliveryModeFastFormat
快速返回結(jié)果,可能會(huì)犧牲圖片質(zhì)量体箕。
*/
@property (nonatomic, assign) PHImageRequestOptionsDeliveryMode deliveryMode;
/**
* a mode that specifies how to resize the reuqested image
*/
@property(nonatomic, assign) PHImageRequestOptionsResizeMode resizeMode;
從iCloud中下載照片
/**
* 能否從iCloud中下載圖片专钉,
YES,本地也沒(méi)有保存此圖片,從iCloud上下載累铅,用'progressHandler'這個(gè)block獲取下載進(jìn)度跃须;
NO,同時(shí)本地也沒(méi)有圖片,'progressHander'中的info[PHImageReustIsInCloudKey]返回值會(huì)表示不能下載
*/
@property(nonatomic, assign, getter=isNetworkAccessAllowed) BOOL networkAccessAllowed;
/**
下載進(jìn)度block娃兽,在多條線程中執(zhí)行操作菇民,刷新UI時(shí)需要回到主線程
*/
typedef void (^ PHAssetImageProgressHandler)(double progress, NSError *error, BOOL *stop, NSDictionary *info);
@property(nonatomic, copy) PHAssetImageProgressHandler progressHandler
PHFetchResult
PHFetchRequest
是有序的photo實(shí)體對(duì)象的容器,包含通過(guò)給定的檢索條件返回的asset投储,相冊(cè)第练,一個(gè)相冊(cè)類(lèi)型中的所有相冊(cè)列表(例如,smart album類(lèi)型下的所有相冊(cè)轻要,它是有序的)复旬,在PHAsset
,PHCollection
,PHAssetcollection
,PHCollectionList
這幾個(gè)類(lèi)中都包含有相應(yīng)的類(lèi)方法包含對(duì)應(yīng)信息的PHFetchRequest
對(duì)象,例如:
- PHAsset
/**
* @param mediaType
* aaset類(lèi)型,包含有:
* PHAssetMediaTypeUnknown = 0,
* PHAssetMediaTypeImage,
* PHAssetMediaTypeVideo,
* PHAssetMediaTypeAudio,
*
* @param options 檢索操作
*
* @return 帶有符合條件的PHAsset對(duì)象集合的PHFetchRequest對(duì)象
*/
+(PHFetchResult<PHAsset *> *)fetchAssetsWithMeidaType:(PHAssetMediaType)mediaType
options:(PHFetchOptions *)options
- PHCollection (抽象類(lèi)冲泥,不允許直接使用,開(kāi)發(fā)過(guò)程中用它的兩個(gè)子類(lèi)PHCollectionList和PHAssetCollection替代)
//Retrieves collections from the root of the photo library’s hierarchy of user-created albums and folders.
+(PHFetchResult<PHCollection *> *)fetchTopLevelUserCollectionsWithOption:(PHFetchOptions *)options;
- PHAssetCollection:
/**
* 獲取自定條件的相冊(cè)
*
* @param type 相冊(cè)類(lèi)型:
PHAssetCollectionTypeAlbum
PHAssetCollectionTypeSmartAlbum
PHAssetCollectionTypeMoment
* @param subtype 相對(duì)于相冊(cè)類(lèi)型更具體些的相片類(lèi)型驹碍,如全景壁涎,照片流等
* @param options 檢索條件
*
* @return 符合條件的相冊(cè)
*/
+(PHFetchResult<PHAssetCollection *> *)fetchAssetColletcionsWithType:(PHAssetCollectionType)type
subtype:(PHAssetCollectionSubtype)subtype
options:(PHFetchOptions *)options;
- PHCollectionList:
+(PHFetchResult<PHCollectionList *> *)fetchCollectionListsWithType:(PHCollectionListType)collectionListType
subtype:(PHCollectionListSubtype)subtype
options:(PHFetchOptions *)options
PHFetchRequest雖然包含了符合條件的photo實(shí)體的集合,與NSArray不同的是它會(huì)動(dòng)態(tài)改變包含的內(nèi)容志秃,在處理大量的asset的時(shí)候效率更高些怔球,實(shí)現(xiàn)的效果也好點(diǎn)
常用屬性與方法
//是否包含給定的對(duì)象
- (BOOL)containsObject:(ObjectType)anObject
//包含的photo實(shí)體個(gè)數(shù)
@property(readonly) NSUInteger count
//指定類(lèi)型的asset數(shù)量
- (NSUInteger)countOfAssetsWithMediaType:(PHAssetMediaType)mediaType
PHImageManager
PHImageManager有一個(gè)單例方法,同時(shí)也提供了用于獲取全尺寸圖片浮还,圖片縮略圖等方法.
獲取圖片:
/**
* 會(huì)多次調(diào)用'resultHandler'竟坛,第一次調(diào)用,返回的圖片清晰度較低钧舌,
* 當(dāng)高清晰度圖片可以獲取時(shí),會(huì)再次調(diào)用担汤,如果高質(zhì)量的圖片在緩存匯中,只調(diào)用一次'resultHandler'洼冻。
* 這個(gè)方法默認(rèn)是異步的崭歧,當(dāng)從后臺(tái)線程調(diào)用這個(gè)方法時(shí),需要將options的'synchronous'設(shè)為YES.
*
* @param asset 保存圖片信息的asset
* @param targetSize 返回的圖片尺寸
* @param contentMode 返回的圖片顯示模式
* @param options image request option
* @param resultHandler 返回的內(nèi)容
*
* @return 請(qǐng)求標(biāo)示撞牢,用于取消請(qǐng)求*/
- (PHImageRequestID)requestImageForAsset:(PHAsset *)asset
targetSize:(CGSize)targetSize
contentMode:(PHImageContentMode)contentMode
options:(PHImageRequestOptions *)options
resultHandler:(void (^)(UIImage *result, NSDictionary *info))resultHandler;
/**
* 請(qǐng)求全尺寸的圖片率碾,只執(zhí)行一次'resultHandler',
* 如果options的'version'被設(shè)置為'PHImageRequestOptionsVersionCurrent,'
* 返回在這個(gè)asset上發(fā)生的任何編輯后的imageData屋彪,如果不是的話所宰,返回最原始版本的圖片
*
* @param asset 保存圖片信息的asset
* @param options image request option
* @param resultHandler 返回的內(nèi)容
*
* @return 請(qǐng)求標(biāo)示,用于取消請(qǐng)求
*/
- (PHImageRequestID)requestImageDataForAsset:(PHAsset *)asset
options:(PHImageRequestOptions *)options
resultHandler:(void (^)(NSData *imageData, NSString *dataUTI, UIImageOrientation orientation, NSDictionary *info))resultHandler;
取消請(qǐng)求:
- (void)cancelImageRequest:(PHImageRequestID)requestID
PHCachingImageManager
PHCachingImageManager是PHImageManager的子類(lèi)畜挥,如果相冊(cè)中有大量的圖片仔粥,而你的需求是要快速的獲取這些圖片的縮略圖和大圖數(shù)據(jù)用于展示,這個(gè)時(shí)候可以用PHCachingImageManager來(lái)實(shí)現(xiàn)蟹但,它具有緩存機(jī)制可以快速獲取一個(gè)圖冊(cè)的縮略圖件炉,或者在后臺(tái)請(qǐng)求全尺寸圖片以便于快速展示。
開(kāi)始緩存圖片:
/**
* @discuss 當(dāng)調(diào)用這個(gè)方法的時(shí)候矮湘,cacaingManager開(kāi)始在獲取你所需要的數(shù)據(jù),
* 同時(shí)在后臺(tái)生成縮略圖口糕,之后可以使用'requestImagesFromAssets:targetSize:contentMode:resultHandler:'
* 方法從緩存中請(qǐng)求數(shù)據(jù)缅阳。
* Photos會(huì)按照給定的尺寸,顯示模式返回圖片景描,緩存中的圖片尺寸是固定的
*
* @param assets 需要緩存的assets
* @param targetSize 圖片尺寸
* @param contentMode 顯示模式
* @param options 請(qǐng)求操作
*/
- (void)startCachingImagesForAssets:(NSArray *)assets
targetSize:(CGSize)targetSize
contentMode:(PHImageContentMode)contentMode
options:(PHImageRequestOptions *)options;
取消圖片緩存:
/**
* 當(dāng)使用collectionView展示圖片縮略圖的時(shí)候十办,如果需要改變尺寸大小的時(shí)候,
* 就需要將緩存中的舊圖片刪除重新緩存超棺。
*
* @param assets 需要緩存的assets
* @param targetSize 圖片尺寸
* @param contentMode 顯示模式
* @param options 請(qǐng)求操作
*/
- (void)stopCachingImagesForAssets:(NSArray *)assets
targetSize:(CGSize)targetSize
contentMode:(PHImageContentMode)contentMode
options:(PHImageRequestOptions *)options;
PHPhotoLibrary
PHPhotoLibrary可以看成是一個(gè)用戶(hù)圖庫(kù)向族,包含了一些的圖片和相冊(cè),同時(shí)包含本地的和iCloud中的資源棠绘。當(dāng)Photos app發(fā)生圖片的修改件相、增加再扭、刪除等改變時(shí),使用PHPhotoLibrary來(lái)做一些刷新UI夜矗,保存數(shù)據(jù)等響應(yīng)動(dòng)作泛范,同時(shí)也可以注冊(cè)觀察者(使用registerChangeObserver
方法),當(dāng)Photos app內(nèi)容發(fā)生改變的時(shí)紊撕,會(huì)觸發(fā)代理方法photoLibraryDidChange
罢荡。
使用PHPhotoLibrary響應(yīng)圖庫(kù)改變
Photos中的PHAsset,PHAssetCollection等是不可變對(duì)象,因此要改變當(dāng)前這些類(lèi)型對(duì)象的時(shí)候就需要使用photo library實(shí)現(xiàn)改變对扶。
請(qǐng)求改變數(shù)據(jù)需要用到PHAssetChangeRequest
,PHAssetcCollectionChangeRequest
,PHCollectionListChangeRequest
区赵。
使用步驟:
1、創(chuàng)建實(shí)體
每個(gè)change request類(lèi)都提供了用于創(chuàng)建響應(yīng)的實(shí)體類(lèi)的方法:
creationRequestForAssetCollectionWithTitle:
創(chuàng)建了一個(gè)asset Collection
如果要添加一個(gè)新的asset到collection中浪南,需要用到change request提供的PHObjectPlaceholder
對(duì)象笼才。在change block結(jié)束之后,使用placeholder對(duì)象提供的localIdentifier
屬性獲取創(chuàng)建好的asset對(duì)象逞泄。
2患整、刪除實(shí)體
例如:deleCollectionLists
用于刪除collection list
3、修改實(shí)體
changeRqeustForAsset
創(chuàng)建了一個(gè)可用于修改的asset的change request
下面代碼實(shí)現(xiàn)往相冊(cè)中添加新圖片的功能:
- (void)addNewAssetWithImge:(UIImage *)image toAlbum:(PHAssetCollection *)album {
[[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{
PHAssetChangeRequest *assetChange = [PHAssetChangeRequest creationRequestForAssetFromImage:image];
PHAssetCollectionChangeRequest *collectionChange = [PHAssetCollectionChangeRequest changeRequestForAssetCollection:album];
PHObjectPlaceholder *placeholder = [assetChange placeholderForCreatedAsset];
[collectionChange addAssets:@[placeholder]];
} completionHandler:^(BOOL success, NSError * _Nullable error) {
NSLog(@"Finished adding asset. %@", (success ? @"Success" : error));
}];
}
note:For each call to the performChanges:completionHandler: or performChangesAndWait:error: method, iOS shows an alert asking the user for permission to edit the contents of the photo library.
注冊(cè)觀察者
PHPhotoLibraryChangeObserver
在系統(tǒng)圖庫(kù)發(fā)生變化的時(shí)候就會(huì)通知指定的觀察者喷众,只要是使用了Photos framework實(shí)現(xiàn)的改變各谚,都會(huì)觸發(fā)觀察者的方法。
registerChangeObserver:
方法指定一名觀察者到千,當(dāng)系統(tǒng)圖庫(kù)發(fā)生改變昌渤,會(huì)觸發(fā)觀察者的指定方法,這個(gè)方法在PHPhotoLibraryChangeObserver
協(xié)議中:- (void)photoLibraryDidChange:(PHChange *)changeInfo ;
PHCollection
PHCollection是一個(gè)抽象類(lèi)憔四,不允許直接使用它的實(shí)例對(duì)象膀息,而是使用它的兩個(gè)子類(lèi):PHAssetCollection
,PHCollectionList
:
PHAssetCollection 包含了帶有圖片或者視頻信息PHAsst對(duì)象,PHCollectionList可以看做是一個(gè)文件夾了赵,里面存放多個(gè)相冊(cè)或者是在年度相冊(cè)中的所有時(shí)刻的照片潜支。
獲取圖片集合:
//用特定的操作從collection list中獲取collection集合
+ (PHFetchResult<PHCollection *>)fetchCollectionsInCollectionList:(PHCollectionList *)collectionList options:(PHFetchOptions *)options
//獲取所有用戶(hù)創(chuàng)建的相冊(cè)或者文件夾。
+ (PHFetchResult<PHCollection *> *)fetchTopLevelUserCollectionWithOptions:(PHFetchOptions *)options;
PHAssetCollection
一個(gè)PHAssetCollection代表一個(gè)相冊(cè)柿汛,可能包含圖片和視頻冗酿,例如:時(shí)間相冊(cè),我的照片流络断,自拍裁替。
在Photos framework中不能直接獲取collection中的內(nèi)容,通過(guò)fetchAssetsInAssetCollecton:options:
獲取到包含PHAsset集合的PHFecthReult對(duì)象貌笨,之后用fetchResult提供的方法取出圖片或者視頻弱判。
獲取asset collection 的方法有許多種:
/**
* @param type 相冊(cè)類(lèi)型:
PHAssetCollectionSubtypeAlbumRegular
Photos APP中創(chuàng)建的相冊(cè)
PHAssetCollectionSubtypeAlbumSyncedEvent
從iPhoto中同步的事件相冊(cè)
PHAssetCollectionSubtypeAlbumSyncedFaces
從iPhoto中同步的包含人臉的相冊(cè)
PHAssetCollectionSubtypeAlbumSyncedAlbum
從iPhoto同步的普通相冊(cè)
PHAssetCollectionSubtypeAlbumImported
從其他設(shè)備導(dǎo)入的相冊(cè)
PHAssetCollectionSubtypeAlbumCloudShared
分享到iCloud的照片流相冊(cè)
PHAssetCollectionSubtypeAlbumMyPhotoStream
用戶(hù)個(gè)人的iCloud照片流
PHAssetCollectionSubtypeSmartAlbumGeneric
沒(méi)有特定類(lèi)型的只能相冊(cè)
PHAssetCollectionSubtypeSmartAlbumPanoramas
全景圖片相冊(cè)
PHAssetCollectionSubtypeSmartAlbumVideos
視頻相冊(cè)
PHAssetCollectionSubtypeSmartAlbumFavorites
個(gè)人收藏
PHAssetCollectionSubtypeSmartAlbumTimelapses
延時(shí)攝影相冊(cè)
PHAssetCollectionSubtypeSmartAlbumAllHidden
隱藏的圖片相冊(cè)
PHAssetCollectionSubtypeSmartAlbumRecentlyAdded
最近添加的圖片
PHAssetCollectionSubtypeSmartAlbumBursts
連拍相冊(cè)
PHAssetCollectionSubtypeSmartAlbumSlomoVideos
慢動(dòng)作視頻相冊(cè)
PHAssetCollectionSubtypeSmartAlbumUserLibrary
在本地存在的相冊(cè)(不包含icloud中的相冊(cè))
PHAssetCollectionSubtypeSmartAlbumSelfPortraits
自拍
PHAssetCollectionSubtypeSmartAlbumScreenshots
截屏
PHAssetCollectionSubtypeAny
獲取所有類(lèi)型的相冊(cè)
* @param options 篩選操作
*
* @return 包含符合條件的相冊(cè)的fetch result
*/
+ (PHFetchResult<PHAssetCollection *> *)fetchAssetCollectionsWithType:(PHAssetCollectionType)type subtype:(PHAssetCollectionSubtype)subtype options:(nullable PHFetchOptions *)options;
/**
* 獲取符合特定類(lèi)型同時(shí)包含指定asset的相冊(cè)集合
*
* @param asset 給定的sset
* @param type 指定相冊(cè)類(lèi)型
* @param options 獲取操作
*
*/
+ (PHFetchResult<PHAssetCollection *> *)fetchAssetCollectionsContainingAsset:(PHAsset *)asset withType:(PHAssetCollectionType)type options:(PHFetchOptions *)options;
PHCollectionList
PHCollectionList包含了更高級(jí)別的asset集合,可嵌套PHAssetCollection
和自身類(lèi)型锥惋,還支持多重嵌套,例如獲取時(shí)刻相冊(cè)和時(shí)刻相冊(cè)中年度照片等昌腰。
獲取collection list的幾種方法:
+ (PHFetchResult<PHCollectionList *>)fetchCollectionListsContainingCollection:(PHCollection *)collection options:(PHFetchOptions *)options;
+ (PHFetchResult<PHCollectionList *> *)fetchCollectionListsContainingCollection:(PHCollection *)collection options:(nullable PHFetchOptions *)options;
+ (PHFetchResult<PHCollectionList *> *)fetchCollectionListsWithLocalIdentifiers:(NSArray<NSString *> *)identifiers options:(nullable PHFetchOptions *)options;
+ (PHFetchResult<PHCollectionList *> *)fetchCollectionListsWithType:(PHCollectionListType)collectionListType subtype:(PHCollectionListSubtype)subtype options:(nullable PHFetchOptions *)options;
+ (PHFetchResult<PHCollectionList *> *)fetchMomentListsWithSubtype:(PHCollectionListSubtype)momentListSubtype containingMoment:(PHAssetCollection *)moment options:(nullable PHFetchOptions *)options;
+ (PHFetchResult<PHCollectionList *> *)fetchMomentListsWithSubtype:(PHCollectionListSubtype)momentListSubtype options:(nullable PHFetchOptions *)options;
PHAsset
PHAsset代表一個(gè)視頻或者圖片資源开伏,當(dāng)需要展示或者修改Photos app中的圖片時(shí)需要先獲取asset,asset是不可改變的并且只保存了所代表的視頻或者圖片的metadata剥哑。
獲取PHAsset的幾種方法:
//從asset collection中獲取符合條件的asset集合
+ (PHFetchResult <PHAsset *> *)fetchAssetsInAssetCollection:(PHAssetCollection *)assetCollection options:(PHFetchOptions *)options
/**
* 默認(rèn)返回所有類(lèi)型的asset硅则,如果要給asset添加更多的類(lèi)型限定,可以在options的filter predicate中設(shè)置株婴。
* @param mediaType :
PHAssetMediaTypeUnknown
未知類(lèi)型
PHAssetMediaTypeImage
靜態(tài)圖片
PHAssetMediaTypeVideo
視頻
PHAssetMediaTypeAudio
音頻
注: PHMediaSubtype:
PHAssetMediaSubtypeNone = 0,
// Photo subtypes
PHAssetMediaSubtypePhotoPanorama = (1UL << 0),
PHAssetMediaSubtypePhotoHDR = (1UL << 1),
PHAssetMediaSubtypePhotoScreenshot NS_AVAILABLE_IOS(9_0) = (1UL << 2),
PHAssetMediaSubtypePhotoLive NS_AVAILABLE_IOS(9_1) = (1UL << 3),
// Video subtypes
PHAssetMediaSubtypeVideoStreamed = (1UL << 16),
PHAssetMediaSubtypeVideoHighFrameRate = (1UL << 17),
PHAssetMediaSubtypeVideoTimelapse = (1UL << 18),
*/
+ (PHFetchResult <PHAsset *> *_Nullable)fetchAssetsWithMediaType:(PHAssetMediaType)mediaType options:(PHFetchOptions *_Nullable)options;
+ (PHFetchResult *<PHAsset *> *)fetchAssetsWithLocalIndentifiers:(NSArray <NSString *>)identifier options:(PHFetchOptions *)options;
/**
* 獲取key asset怎虫,每一個(gè)collection都至少有一個(gè)key asset,每個(gè)不同類(lèi)型的collection用于定義key asset的方式也不同困介,有的collection中只有一個(gè)key asset大审,有的含有多個(gè)。
* 例如在相機(jī)膠卷中座哩,最近拍攝的圖片或者視頻就是key asset
*/
+ (PHFetchResult <PHAsset *>)fetchKeyAssetsInAssetCollection:(PHAssetCollection *)collection options:(PHFetchOptions *)options;
/**
* 獲取所有的符合條件的asset徒扶,默認(rèn)條件下,不包含通過(guò)iTunes同步過(guò)來(lái)的和存儲(chǔ)在iCloud中的圖片根穷。
* 更改此條件姜骡,配置options的'includeAssetSourceType'屬性來(lái)實(shí)現(xiàn)。
*/
+ (PHFetchResult <PHAsset *> *)fetchAssetsWithOptions:(PHFetchOptions *)options;
//獲取連拍照片
+ (PHFetchResult <PHAsset *>)fetchAssetWithBurstIdentifier(NSString *)burstIdentifier options:(PHFetchOptions *)options;