PhotoKit 简介
PhotoKit 是iOS8之后新出一套比 AssetsLibrary 更完整也更高效的库,对资源的处理跟 AssetsLibrary 也有很大的不同。
先简单介绍几个Photos的类:
PHAsset: 代表照片库中的一个资源,跟 ALAsset 类似,通过 PHAsset 可以获取和保存资源
PHFetchOptions: 获取资源时的参数,可以传 nil,即使用系统默认值
PHFetchResult: 表示一系列的资源集合,也可以是相册的集合
PHAssetCollection: 表示一个相册或者一个时刻,或者是一个「智能相册(系统提供的特定的一系列相册,例如:最近删除,视频列表,收藏等等,如下图所示)
PHImageManager: 用于处理资源的加载,加载图片的过程带有缓存处理,可以通过传入一个 PHImageRequestOptions 控制资源的输出尺寸,同异步获取,是否获取iCloud图片等
PHCachingImageManager: 继承 PHImageManager ,对Photos的图片或视频资源提供了加载或生成预览缩略图和全尺寸图片的方法,针对预处理巨量的资源进行了优化。
PHImageRequestOptions: 如上面所说,控制加载图片时的一系列参数
PHFetchOptions *options = [[PHFetchOptions alloc] init];
// 根据创建时间升序排序
options.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"creationDate" ascending:YES]];
// 获取所有的图片
_assets = [PHAsset fetchAssetsWithOptions:options];
// 获取智能相册
_smartAlbumResult = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeSmartAlbum subtype:PHAssetCollectionSubtypeAlbumRegular options:nil];
// 获取相册
_albumResult = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeAlbum subtype:PHAssetCollectionSubtypeSmartAlbumUserLibrary options:nil];
// 获取某个相册下的所有照片
[PHAsset fetchAssetsInAssetCollection:[_smartAlbumResult objectAtIndex:indexPath.row]
// 每个Cell的Size
#define kCellWH ([UIScreen mainScreen].bounds.size.width - 2 * 3 - 20) / 4.0
// 屏幕像素的比例
#define kCellScale [UIScreen mainScreen].scale
// 根据PHAsset获取图片内容, targetSize = size * scale,按照像素来算的
[[PHCachingImageManager defaultManager] requestImageForAsset:asset targetSize:CGSizeMake(kCellWH * kCellScale, kCellWH * kCellScale) contentMode:PHImageContentModeAspectFit options:nil resultHandler:^(UIImage * _Nullable result, NSDictionary * _Nullable info) {
cell.image = result;
}];
// 根据PHAsset获取AVAsset播放视频
[[PHCachingImageManager defaultManager] requestAVAssetForVideo:asset options:nil resultHandler:^(AVAsset * _Nullable avAsset, AVAudioMix * _Nullable audioMix, NSDictionary * _Nullable info) {
// 当前线程为异步线程
AVPlayerViewController *playerVc = [[AVPlayerViewController alloc] init];
AVPlayerItem *playerItem = [AVPlayerItem playerItemWithAsset:avAsset];
playerVc.player = [AVPlayer playerWithPlayerItem:playerItem];
playerVc.videoGravity = AVLayerVideoGravityResizeAspectFill;
dispatch_async(dispatch_get_main_queue(), ^{
// 需要在主线程中调用
[self presentViewController:playerVc animated:YES completion:nil];
});
}];
Photos.framework Basic Usage. 获取相册列表、照片浏览器,录制视频、视频转码、视频播放、录制视频时间限制、从相册选择视频时间限制、上传视频到服务器
Demo地址:https://github.com/jayZhangh/PhotosFrameworkBasicUsage
网友评论