PhotoKit框架學習筆記,圖片選擇器

PhotoKit是蘋果在iOS8后提供的新框架,可以讓開發(fā)者更好進行與照片庫有關操作。

一 .先列列舉一下photoKit中的一些基本構成:

· PHAssetCollection:照片資源的集合類,可以表示一個相冊,一個時刻等等

·?PHCollectionList:表示一個資源集合的集合,比如一個相冊,相冊中又有其他的相冊集

·?PHFetchResult:一系列資源的結果集合,也可以是相冊的集合,從PHCollection的子類的類方法中獲得(如fetchAssetCollectionsWithType:options:),這個對象包含很多個PHAsset

·?PHFetchOptions:獲取資源結果時,所傳的參數(shù),具體參數(shù)可以查看文檔

·?PHAsset 表示用戶照片庫中一個單獨的資源,用以提供資源的元數(shù)據(jù),是PHImageManager直接處理的對象?

· PHImageManager:通過將圖片資源加載處理輸出圖片的類

·?PHImageRequestOptions:對資源數(shù)據(jù)進行處理的一些請求參數(shù),比如圖片大小,質量高低等?

PhotoKit的關系概念圖如下:

二.獲取資源:

1. 獲取請求:

獲取請求是由PHAssetCollection或PHCollectionList使用類方法獲取的,獲取方法的命名方式為:fetchXXX(...,options:PHFetchOptions)返回值為資源或者collection的集合PHFetchResult,其中options參數(shù)相當于提供一個過濾或者排序,如

//按照估計的每個相冊的照片數(shù)排序

NSSortDescriptor * sort = [NSSortDescriptor sortDescriptorWithKey:@"estimatedAssetCount" ascending:NO];

PHFetchOptions * fetchOptions= [[PHFetchOptions alloc] init];

fetchOptions.sortDescriptors = @[sort];

//根據(jù)類型(PHAssetCollectionTypeAlbum )獲取照片庫中所有的用戶創(chuàng)建的相冊,返回結果是PHFetchResult,里面是所有的相冊列表

PHFetchResult * alist_album = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeAlbum? subtype:PHAssetCollectionSubtypeAlbumRegular options:fetchOptions];

2. 獲取圖片的元數(shù)據(jù):

上面獲取的是相冊的列表集合,現(xiàn)在從列表中取出每個圖片的元數(shù)據(jù),利用PHAsset獲取圖片元數(shù)據(jù)

PHFetchOptions * options = [[PHFetchOptions alloc] init];

NSSortDescriptor * descriptor = [[NSSortDescriptor alloc] initWithKey:@"creationDate" ascending:YES];

//此處根據(jù)照片的創(chuàng)建時間,對相冊內的照片進行排序

options.sortDescriptors = @[descriptor];

//這個結果是相冊中所有圖片元數(shù)據(jù)的集合,其中assetCollection就是上面的代碼塊中獲取的相冊列表中的對象比如alist_album[0]

PHFetchResult * fetchResult = [PHAsset fetchAssetsInAssetCollection:assetCollection options:options];

3. 請求圖像:

圖像請求是通過 requestImageForAsset(...) 方法派發(fā)的。這個方法接受一個 PHAsset,可以設置返回圖像的大小和圖像的其它可選項 (通過 PHImageRequestOptions 參數(shù)對象設置),以及結果回調 (result handler)。這個方法的返回值可以用來在所請求的數(shù)據(jù)不再被需要時取消這個請求。如

_imageManager = [PHCachingImageManager defaultManager];

//這里options可以填寫很多可選參數(shù),具體可查看文檔,此處贊設置為nil

//targetsize圖片的目標尺寸參數(shù)

[_imageManager requestImageForAsset:self.fetchResults[indexPath.item] targetSize:_imageSize contentMode:PHImageContentModeAspectFill options:nil resultHandler:^(UIImage * _Nullable result, NSDictionary * _Nullable info) {

//此處的result就是請求的圖像

}];

這里對立面的參數(shù)進行介紹一下:

· 圖像的尺寸和裁剪:對返回圖像的尺寸定義和裁剪的參數(shù)是分布在兩個地方的。targetSize 和 contentMode這倆參數(shù)會被直接傳入requestImageForAsset(...) 方法內。這個 content Mode 和 UIView 的 contentMode 參數(shù)類似,決定了照片應該以按比例縮放還是按比例填充的方式放到目標大小內。注意:如果不對照片大小進行修改或裁剪,那么方法參數(shù)是PHImageManagerMaximumSize 和 PHImageContentMode.Default 。此外,PHImageRequestOptions 還提供了一些方式來確定圖像管理器該以怎樣的方式來重新設置圖像大小。resizeMode 屬性可以設置為 .Exact (返回圖像必須和目標大小相匹配),.Fast (比 .Exact 效率更高,但返回圖像可能和目標大小不一樣) 或者 .None。還有個值得一提的是,normalizedCroppingMode 屬性讓我們確定圖像管理器應該如何裁剪圖像。注意:如果設置了 normalizedcroppingMode 的值,那么 resizeMode 需要設置為 .Exact。

- 請求遞送和進度:默認情況下,如果圖像管理器決定要用最優(yōu)策略,那么它會在將圖像的高質量版本遞送給你之前,先傳遞一個較低質量的版本。你可以通過 deliveryMode 屬性來控制這個行為;上面所描述的默認行為的值為 .Opportunistic。如果你只想要高質量的圖像,并且可以接受更長的加載時間,那么將屬性設置為 .HighQualityFormat。如果你想要更快的加載速度,且可以犧牲一點圖像質量,那么將屬性設置為 .FastFormat。你可以使用 PHImageRequestOptions 的 synchronous 屬性,讓 requestImage... 系列的方法變成同步操作。注意:當 synchronous 設為 true 時,deliveryMode 屬性就會被忽略,并被當作 .HighQualityFormat 來處理

· 結果回調:結果回調是一個包含了一個 UIImage 變量和一個 info 字典作為參數(shù)的 block。根據(jù)參數(shù)和請求的選項,在請求的整個生命周期,它可以被圖像管理器多次調用。info 字典提供了關于當前請求狀態(tài)的信息,比如:圖像是否必須從 iCloud 請求 (如果你初始化時將 networkAccessAllowed 設置成 false,那么就必須重新請求圖像) —— PHImageResultIsInCloudKey 。當前遞送的 UIImage 是否是最終結果的低質量格式。當高質量圖像正在下載時,這個可以讓你給用戶先展示一個預覽圖像 —— PHImageResultIsDegradedKey。請求 ID (可以便捷的取消請求),以及請求是否已經(jīng)被取消 —— PHImageResultRequestIDKey 和 PHImageCancelledKey。如果沒有圖像提供給 result handler,字典內還會有一個錯誤信息 —— PHImageErrorKey。這些值可以讓你更新你的 UI 來告知用戶,和上面討論到的 progressHandler 一起,來表示出它們的加載狀態(tài)

所以如果你的app支持iOS8以上,可以考慮使用PhotoKit,我也基于PhotoKit封裝了一個照片選擇的工具,與微信的選擇圖片效果類似,在使用微信選擇照片的過程中,發(fā)現(xiàn)微信對于全景照片的縮略圖并沒處理成清晰的版本,在我寫的工具中所有的照片縮略圖都能很好的展示,有興趣的可以看看我封裝的工具ImagePicker

此文參考:

1.https://developer.apple.com/reference/photos

2.https://objccn.io/issue-21-4/

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容