相册、实时照片、视频获取。
图片和视频的获取需要通过PHImageManager获取
PHImageManager在框架中是个单例对象,用[PHImageManager defaultManager]获取,它提供了加载图片和视频的方法。
比如:图像请求是通过 requestImageForAsset(…) 方法派发的。
这些方法的参数:
- 一个 PHAsset对象,
- PHImageRequestOptions 参数对象:可以设置返回图像的大小和图像的其它可选项
- 结果回调 (result handler)。
拉取资源请求参数PHImageRequestOptions
1.1 isSynchronous。是否同步处理一个图像请求。默认为NO
/*
- 1、如果`synchronous `属性为YES,一定为同步请求。resultHandler只会执行一次,并且返回高质量的图片。
- 2、如果`synchronous `属性为NO,不一定时异步。resultHandler是否会被多次调用取决于deliveryMode属性:
- .HighQualityFormat ,resultHandler调用一次,框架只返回高质量图。
- .FastFormat,resultHandler也只被调用一次,最快速的得到一个图像结果,可能会牺牲图像质量。
- .Opportunistic,resultHandler会被调用多次,会先提供低质量的图像以临时显示,随后会将指定尺寸的图像返回。如果指定尺寸的高质量的图像有缓存,那么直接返回高质量的图像。
*/
1.2 PHImageRequestOptionsDeliveryMode。
//请求的图像质量和交付优先级。只用这个属性将告诉Photos要快速提供图像(可能牺牲图像质量)、提供高质量图像(可能牺牲速度)、系统自动选择
typedef NS_ENUM(NSInteger, PHImageRequestOptionsDeliveryMode) {
PHImageRequestOptionsDeliveryModeOpportunistic = 0, // 为了平衡图像质量和响应速度,Photos会提供一个或者多个结果
PHImageRequestOptionsDeliveryModeHighQualityFormat = 1, // 只提供高质量图像、无论他需要多少时间加载
PHImageRequestOptionsDeliveryModeFastFormat = 2 // 最快速的得到一个图像结果,可能会牺牲图像质量。
};
1.3 PHImageRequestOptionsVersion。
//请求的图片版本。使用这个属性请求图片的不带编辑的版本,或则请求一个高质量的原始数据。
typedef NS_ENUM(NSInteger, PHImageRequestOptionsVersion) {
PHImageRequestOptionsVersionCurrent = 0, // 图片的最新版本(包括所有编辑版本)
PHImageRequestOptionsVersionUnadjusted, // 原版、无任何编辑版本
PHImageRequestOptionsVersionOriginal // 原始的高保真的版本
} PHOTOS_ENUM_AVAILABLE_IOS_TVOS(8_0, 10_0);
1.4 PHImageRequestOptionsResizeMode。
// 对请求的图像怎样缩放。使用此属性可选择在请求图像数据时将图像与目标大小如何适应。
typedef NS_ENUM(NSInteger, PHImageRequestOptionsResizeMode) {
PHImageRequestOptionsResizeModeNone = 0, // 不做任何调整
PHImageRequestOptionsResizeModeFast, // 最快速的调整图像大小,有可能比给定大小略大
PHImageRequestOptionsResizeModeExact, // 保证与给定大小相等。如果使用normalizedCropRect属性,则必须指定为该模式。
};
1.5 normalizedCropRect。
// normalizedCropRect。是否对原始图像进行裁剪。如果要裁剪图像,请在坐标空间内指定要裁剪的区域,在坐标系内{0,0}点在图像左上角,{1.0,1.0}点在图像的右下角。这个属性默认值为CGRectZero,代表不裁剪,如果你指定了裁剪,那么必须对resizeMode属性设置为`PHImageRequestOptionsResizeModeExact `
获取图片
/*
下载照片原图
PHAsset:照片元数据
options:图片信息配置
resultHandler:返回结果
*/
@objc open class func requestImageData(for asset: PHAsset, options: PHImageRequestOptions?, resultHandler: @escaping (Data?, String?, UIImage.Orientation, [AnyHashable: Any]?) -> Void, progressHandler:@escaping (Double) -> Void) -> PHImageRequestID {
var requestOptions = options
// 配置请求照片信息
if requestOptions == nil {
requestOptions = PHImageRequestOptions()
requestOptions?.deliveryMode = .highQualityFormat
requestOptions?.isNetworkAccessAllowed = true
}
let progressHandler: PHAssetVideoProgressHandler = { (progress, error, stop, info) in
if let b = info?[PHImageCancelledKey] as? NSNumber, b.boolValue {
return
}
if error != nil {
return
}
progressHandler(progress)
}
requestOptions?.progressHandler = progressHandler
return PHImageManager.default().requestImageData(for: asset, options: requestOptions, resultHandler: resultHandler)
}
获取视频
/**
获取视频
*/
open class func requestAVAssetAsset(forVideo asset: PHAsset, options: PHVideoRequestOptions?, resultHandler: @escaping (AVAsset?, AVAudioMix?, [AnyHashable: Any]?) -> Void, progressHandler:@escaping (Double) -> Void) -> PHImageRequestID {
var requestOptions = options
// 获取视频请求信息
if requestOptions == nil {
requestOptions = PHVideoRequestOptions()
requestOptions?.deliveryMode = .automatic
requestOptions?.isNetworkAccessAllowed = true
}
// 获取进度
let progressHandler: PHAssetVideoProgressHandler = { (progress, error, stop, info) in
if error != nil {
return
}
progressHandler(progress)
}
requestOptions?.progressHandler = progressHandler
return PHImageManager.default().requestAVAsset(forVideo: asset, options: requestOptions, resultHandler: resultHandler)
}
获取实时照片(livePhoto)信息
PHImageManager.default().requestLivePhoto(for: asset, targetSize: thumbnailSize, contentMode: .aspectFill, options: nil, resultHandler: { (livePhoto, info) in
})