在使用Photos框架时获取的图片size不准确问题
在开发中有自定义相册预览需求,就用了Photos框架获取系统中的相册名称和对应图片,因为有图片编辑裁剪需求,要根据图片的size变化编辑框。
Photos获取系统相册数组
PHFetchResult * sysfetchResult = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeSmartAlbum subtype:PHAssetCollectionSubtypeAlbumSyncedAlbum options:nil];
for (PHAssetCollection * assetCollection in sysfetchResult) {
//相册名称
NSString * collectionTitle = assetCollection.localizedTitle;
//获取某个相册的全部图像对象
NSArray * arr = [self getAssetWithCollection:assetCollection];
}
获取相册中所有图片对象
- (NSArray *)getAssetWithCollection:(PHAssetCollection *)collection {
PHFetchOptions * options = [[PHFetchOptions alloc] init];
options.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"creationDate" ascending:YES]];
NSMutableArray * assetArray = [NSMutableArray array];
PHFetchResult * assetFetchResult = [PHAsset fetchAssetsInAssetCollection:collection options:options];
for (PHAsset * asset in assetFetchResult) {
[assetArray addObject:asset];
}
return assetArray;
}
至此,我们已经可以获取到相册的所有PHAsset对象,在UI展示时,需要根据PHAsset对象去获取UIImage对象,方法如下:
PHImageRequestOptions * options = [[PHImageRequestOptions alloc] init];
//是否缩放
options.resizeMode = PHImageRequestOptionsResizeModeExact;
//图片质量
options.deliveryMode = PHImageRequestOptionsDeliveryModeFastFormat;
//当图片为icoud资源是否获取,默认No
options.networkAccessAllowed = NO;
//是否为同步,默认为no
options.synchronous = YES;
[[PHCachingImageManager defaultManager] requestImageForAsset:asset targetSize:CGSizeMake(width, height) contentMode:PHImageContentModeAspectFill options:options resultHandler:^(UIImage * _Nullable result, NSDictionary * _Nullable info) {
//当我们拿到了result图像,展示即可
}];
在获取到目标图像后,发现根据上述方法获取到的图像的size和图像的真实size不符。
后检查代码发现,在请求image数据时,对于图像是否缩放的配置进行了修改,将缩放属性修改为
options.resizeMode = PHImageRequestOptionsResizeModeNone即可。