在项目开发的空闲之余想自己做一个相册用于获取系统的图片,虽然很简单,但是也记录一下吧
首先苹果现在的相册类已经采用photo类库,原有的AssetsLibrary/AssetsLibrary类库在最新的版本无法使用。实现相册功能主要分为以下三步
第一:获取系统相册的图片
//获取所有资源的集合,并按资源的创建时间排序
PHFetchOptions *options = [[PHFetchOptions alloc] init];
options.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"creationDate" ascending:YES]];
[[PhotoHelper photoServer].assetAry removeAllObjects];
PHFetchResult *assetsFetchResults = [PHAsset
fetchAssetsWithOptions:options];
for (PHAsset *asset in assetsFetchResults) {
if (asset.mediaType == PHAssetMediaTypeImage) {
[[PhotoHelper photoServer].assetAry addObject:asset];
}
}
在此处我是定义了一个单例类PhotoHelper作为对图片的操做对象,苹果获取系统相册的图片貌似只能取照片流中的图片,至于是否能取其它相册暂时没有研究。此时注意不要直接对assetsFetchResults中图片进行处理后放入相册数组,会导致内存警告闪退。最好的方法是将PHAsset类对象存入数组
第二步:对图片进行压缩处理,此处碰到几个问题
PHImageRequestOptions *phImageRequestOptions = [[PHImageRequestOptions alloc] init];
phImageRequestOptions.synchronous = YES; //强制同步执行
PHAsset *asset = [[PhotoHelper photoServer].assetAry objectAtIndex:indext];
[[PHImageManager defaultManager] requestImageForAsset:asset targetSize:PHImageManagerMaximumSize contentMode:PHImageContentModeAspectFit options:phImageRequestOptions resultHandler:^(UIImage * _Nullable result, NSDictionary * _Nullable info) {
[PhotoHelper photoServer].images = result;
}];
此处是将图片按照一定比例压缩后存入images数组,但是苹果提供的方法是调用了一个block。若要保证block内的方法一定要在图片压缩完成后调用则要将phImageRequestOptions.synchronous设置成YES强制同步执行