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];