PHAsset
部分屬性解析
1、HDR 和全景照片
mediaSubtypes
?屬性驗證資源庫中的圖像在捕捉時是否開啟了 HDR,拍攝時是否使用了相機應用的全景模式。
2、收藏和隱藏資源
要驗證一個資源是否被用戶標記為收藏或被隱藏,只要檢查?PHAsset
?實例的?favorite
?和?hidden
?屬性即可。
3、連拍模式照片
對于一個資源,如果其?PHAsset
?的?representsBurst
?屬性為?true
,則表示這個資源是一系列連拍照片中的代表照片 (多張照片是在用戶按住快門時拍攝的)。它還有一個屬性是?burstIdentifier
,如果想要獲取連拍照片中的剩余的其他照片,可以通過將這個值傳入?fetchAssetsWithBurstIdentifier(...)
?方法來獲取。
用戶可以在連拍的照片中做標記;此外,系統也會自動用各種試探來標記用戶可能會選擇的潛在代表照片。這個元數據是可以通過PHAsset
?的?burstSelectionTypes
?屬性來訪問。這個屬性是用三個常量組成的位掩碼:.UserPick
?表示用戶手動標記的資源,.AutoPick
?表示用戶可能標記的潛在資源,.None
?表示沒有標記的資源。
?
獲取圖像
static PHImageRequestOptions *requestOptions;
if (!requestOptions) { requestOptions = [[PHImageRequestOptions alloc] init]; requestOptions.deliveryMode = PHImageRequestOptionsDeliveryModeOpportunistic; requestOptions.resizeMode = PHImageRequestOptionsResizeModeFast; } photoCell.requestID = [[PHImageManager defaultManager] requestImageForAsset:asset targetSize:CGSizeMake(CGRectGetWidth(photoCell.thumbView.frame) ,CGRectGetHeight(photoCell.thumbView.frame) ) contentMode:PHImageContentModeAspectFill options:requestOptions resultHandler:^(UIImage *result, NSDictionary *info) { photoCell.thumbView.image = result; }];
1、PHImageRequestOptions類用于定制請求。
上面的方法返回指定尺寸的圖像,如果你僅僅指定必要的參數而沒有對 options 進行配置的話,返回的圖像尺寸將會是原始圖像的尺寸。或者,你指定的尺寸很小,這時候會按照你的要求來返回接近該尺寸的圖像。PHImageRequestOptions有以下幾個重要的屬性:
synchronous:指定請求是否同步執行。 默認為 NO,如果?synchronous 為 YES,即同步請求時,deliveryMode 會被視為 PHImageRequestOptionsDeliveryModeHighQualityFormat,即自動返回高質量的圖片,因此不建議使用同步請求,否則如果界面需要等待返回的圖像才能進一步作出反應,則反應時長會很長。
resizeMode:對請求的圖像怎樣縮放。有三種選擇:None,不縮放;Fast,盡快地提供接近或稍微大于要求的尺寸;Exact,精準提供要求的尺寸。(resizeMode 默認是 None,這也造成了返回圖像尺寸與要求尺寸不符。這點需要注意。要返回一個指定尺寸的圖像需要避免兩層陷阱:一定要指定 options 參數,resizeMode 不能為 None。)
deliveryMode:圖像質量。有三種值:Opportunistic,在速度與質量中均衡;HighQualityFormat,不管花費多長時間,提供高質量圖像;FastFormat,以最快速度提供好的質量。這個屬性只有在 synchronous 為 true 時有效。
normalizedCropRect:用于對原始尺寸的圖像進行裁剪,基于比例坐標。只在 resizeMode 為 Exact 時有效。
networkAccessAllowed :參數控制是否允許網絡請求,默認為 NO,如果不允許網絡請求,那么就沒有然后了,當然也拉取不到 iCloud 的圖像原件。(在 PhotoKit 中,對 iCloud 照片庫有很好的支持,如果用戶開啟了 iCloud 照片庫,并且選擇了“優化 iPhone/iPad 儲存空間”,或者選擇了“下載并保留原件”但原件還沒有加載好的時候,PhotoKit 也會預先拿到這些非本地圖像的 PHAsset,但是由于本地并沒有原圖,所以如果產生了請求高清圖的請求,PHotoKit 會嘗試從 iCloud 下載圖片,而這個行為最終的表現,會被?PHImageRequestOptions 中的值所影響。)
versions:這個屬性是指獲取的圖像是否需要包含系統相冊“編輯”功能處理過的信息(如濾鏡,旋轉等);
? .Current 會遞送包含所有調整和修改的圖像;.Unadjusted 會遞送未被施加任何修改的圖像;.Original 會遞送原始的、最高質量的格式的圖像 (例如 RAW 格式的數據。而當將屬性設置為 .Unadjusted 時,會遞送一個 JPEG)。
?
2、progressHandler
還有一個與 iCloud 密切相關的屬性?progressHandler,當圖像需要從 iCloud 下載時,這個 block 會被自動調用,block 中會返回圖像下載的進度,圖像的信息,出錯信息。開發者可以利用這些信息反饋給用戶當前圖像的下載進度以及狀況,但需要注意?progressHandler 不在主線程上執行,因此在其中需要操作 UI,則需要手工放到主線程執行。
requestImageForAsset 中的參數?resultHandler 可能會被多次調用,這種情況就是圖像需要從 iCloud 中下載的情況。在?requestImageForAsset 返回的內容中,一開始的那一次請求中會返回一個小尺寸的圖像版本,當高清圖像還在下載時,開發者可以首先給用戶展示這個低清的圖像版本,然后 block 在多次調用后,最終會返回高清的原圖。至于當前返回的圖像是哪個版本的圖像,可以通過 block 返回的 NSDictionary info 中獲知,PHImageResultIsDegradedKey 表示當前返回的 UIImage 是低清圖。如果需要判斷是否已經獲得高清圖,可以這樣判斷:
// 排除取消,錯誤,低清圖三種情況,即已經獲取到了高清圖
BOOL
downloadFinined = ![[info objectForKey:PHImageCancelledKey] boolValue] && ![info objectForKey:PHImageErrorKey] && ![[info objectForKey:PHImageResultIsDegradedKey] boolValue];
圖像是否必須從 iCloud 請求 (如果你初始化時將 networkAccessAllowed 設置成 false,那么就必須重新請求圖像) —— PHImageResultIsInCloudKey 。
當前遞送的 UIImage 是否是最終結果的低質量格式。當高質量圖像正在下載時,這個可以讓你給用戶先展示一個預覽圖—PHImageResultIsDegradedKey。
請求 ID (可以便捷的取消請求),以及請求是否已經被取消 —— PHImageResultRequestIDKey 和 PHImageCancelledKey。
如果沒有圖像提供給 result handler,字典內還會有一個錯誤信息 —PHImageErrorKey。
這些值可以讓你更新你的 UI 來告知用戶,和上面討論到的 progressHandler 一起,來表示出它們的加載狀態。
[[PHImageManager defaultManager] cancelImageRequest:(PHImageRequestID)photoCell.requestID];
?