Photos中常用類(lèi)(獲取展示功能相關(guān))簡(jiǎn)介

簡(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)容
    PHAssetPHAsssetChangeRequest定義了一些用于編輯照片或者視頻內(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è)屬性:predicatesortDescriptors

  • 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;
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末屿良,一起剝皮案震驚了整個(gè)濱河市圈澈,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌尘惧,老刑警劉巖康栈,帶你破解...
    沈念sama閱讀 212,454評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異喷橙,居然都是意外死亡啥么,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)贰逾,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)悬荣,“玉大人,你說(shuō)我怎么就攤上這事疙剑∮缥酰” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,921評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵核芽,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我酵熙,道長(zhǎng)轧简,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,648評(píng)論 1 284
  • 正文 為了忘掉前任匾二,我火速辦了婚禮哮独,結(jié)果婚禮上拳芙,老公的妹妹穿的比我還像新娘。我一直安慰自己皮璧,他們只是感情好舟扎,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,770評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著悴务,像睡著了一般睹限。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上讯檐,一...
    開(kāi)封第一講書(shū)人閱讀 49,950評(píng)論 1 291
  • 那天羡疗,我揣著相機(jī)與錄音,去河邊找鬼别洪。 笑死叨恨,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的挖垛。 我是一名探鬼主播痒钝,決...
    沈念sama閱讀 39,090評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼痢毒!你這毒婦竟也來(lái)了送矩?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,817評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤闸准,失蹤者是張志新(化名)和其女友劉穎益愈,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體夷家,經(jīng)...
    沈念sama閱讀 44,275評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蒸其,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,592評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了库快。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片摸袁。...
    茶點(diǎn)故事閱讀 38,724評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖义屏,靈堂內(nèi)的尸體忽然破棺而出靠汁,到底是詐尸還是另有隱情,我是刑警寧澤闽铐,帶...
    沈念sama閱讀 34,409評(píng)論 4 333
  • 正文 年R本政府宣布蝶怔,位于F島的核電站,受9級(jí)特大地震影響兄墅,放射性物質(zhì)發(fā)生泄漏踢星。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,052評(píng)論 3 316
  • 文/蒙蒙 一隙咸、第九天 我趴在偏房一處隱蔽的房頂上張望沐悦。 院中可真熱鬧成洗,春花似錦、人聲如沸藏否。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,815評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)副签。三九已至遥椿,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間继薛,已是汗流浹背修壕。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,043評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留遏考,地道東北人慈鸠。 一個(gè)月前我還...
    沈念sama閱讀 46,503評(píng)論 2 361
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像灌具,于是被迫代替她去往敵國(guó)和親青团。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,627評(píng)論 2 350

推薦閱讀更多精彩內(nèi)容

  • 相冊(cè)適配 前言 由于在iOS8及以后蘋(píng)果將原有的操作相冊(cè)的ALAssetsLibrary framework替換為...
    wentianen閱讀 1,798評(píng)論 0 6
  • 寫(xiě)在前面 在手機(jī)APP日益增加的前提下珠十,如何更好的提升用戶(hù)的交互體驗(yàn)似乎成為衡量一個(gè)APP重要指標(biāo)料扰。上述的感悟源于...
    Jack_lin閱讀 6,231評(píng)論 12 62
  • 在微博上出現(xiàn)了越來(lái)越多的被標(biāo)記為 Live 的圖片,這種圖片是一種動(dòng)圖 LivePhoto焙蹭,長(zhǎng)按之后會(huì)進(jìn)行播放晒杈。那...
    wvqusrtg閱讀 4,882評(píng)論 0 9
  • 一、獲取單張圖片 1孔厉、利用UIImagePickerController可以從系統(tǒng)自帶的App中獲得圖片2拯钻、設(shè)置代...
    白極翁閱讀 7,011評(píng)論 0 9
  • 5點(diǎn)半自然醒來(lái),貝貝也起來(lái)了撰豺,她摟著我粪般,傷心地說(shuō)家長(zhǎng)出題的作業(yè)忘了做。我?guī)退龊妙}污桦,開(kāi)始靜心亩歹,剛開(kāi)始就被打斷,貝...
    JC賈閱讀 230評(píng)論 1 0