使用Photos.framework对相册的常用操作
2016-11-12 10:21
281 查看
自己最近抽空写了一个相册多选框架,用到对一些对相册相关的操作,使用的便是iOS8.0之后,apple推出的新框架 Photos.framework
github地址:https://github.com/longitachi/ZLPhotoBrowser 喜欢的朋友可以给个star
下载的朋友建议去Git上下载,由于csdn的资源不支持实施更改,git上将持续更新
![](http://img.blog.csdn.net/20160408102153432)
废话不多说,来干货
以下操作都需要导入<Photos/Photos.h>头文件
[objc] view
plain copy
![](https://code.csdn.net/assets/CODE_ico.png)
![](https://code.csdn.net/assets/ico_fork.svg)
PHAuthorizationStatus status = [PHPhotoLibrary authorizationStatus];
if (status == PHAuthorizationStatusRestricted ||
status == PHAuthorizationStatusDenied) {
// 这里便是无访问权限
}
plain copy
![](https://code.csdn.net/assets/CODE_ico.png)
![](https://code.csdn.net/assets/ico_fork.svg)
[[PHPhotoLibrary sharedPhotoLibrary] registerChangeObserver:self];
当然,这个"self"是要遵守 PHPhotoLibraryChangeObserver 协议的
回调方法如下,不过这个地方是有一个坑的,就是这个回调是在一个子线程里面,如果你想要对UI进行操作的话,则必须回调主线程
[objc] view
plain copy
![](https://code.csdn.net/assets/CODE_ico.png)
![](https://code.csdn.net/assets/ico_fork.svg)
//相册变化回调
- (void)photoLibraryDidChange:(PHChange *)changeInstance
{
dispatch_sync(dispatch_get_main_queue(), ^{
// your codes
});
}
[objc] view
plain copy
![](https://code.csdn.net/assets/CODE_ico.png)
![](https://code.csdn.net/assets/ico_fork.svg)
#pragma mark - 获取相册内所有照片资源
- (NSArray<PHAsset *> *)getAllAssetInPhotoAblumWithAscending:(BOOL)ascending
{
NSMutableArray<PHAsset *> *assets = [NSMutableArray array];
PHFetchOptions *option = [[PHFetchOptions alloc] init];
//ascending 为YES时,按照照片的创建时间升序排列;为NO时,则降序排列
option.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"creationDate" ascending:ascending]];
PHFetchResult *result = [PHAsset fetchAssetsWithMediaType:PHAssetMediaTypeImage options:option];
[result enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOLBOOL * _Nonnull stop) {
PHAsset *asset = (PHAsset *)obj;
NSLog(@"照片名%@", [asset valueForKey:@"filename"]);
[assets addObject:asset];
}];
return assets;
}
plain copy
![](https://code.csdn.net/assets/CODE_ico.png)
![](https://code.csdn.net/assets/ico_fork.svg)
PHImageRequestOptions *option = [[PHImageRequestOptions alloc] init];
//仅显示缩略图,不控制质量显示
/**
PHImageRequestOptionsResizeModeNone,
PHImageRequestOptionsResizeModeFast, //根据传入的size,迅速加载大小相匹配(略大于或略小于)的图像
PHImageRequestOptionsResizeModeExact //精确的加载与传入size相匹配的图像
*/
option.resizeMode = PHImageRequestOptionsResizeModeFast;
option.networkAccessAllowed = YES;
//param:targetSize 即你想要的图片尺寸,若想要原尺寸则可输入PHImageManagerMaximumSize
[[PHCachingImageManager defaultManager] requestImageForAsset:asset targetSize:size contentMode:PHImageContentModeAspectFit options:option resultHandler:^(UIImage * _Nullable image, NSDictionary * _Nullable info) {
//解析出来的图片
}];
plain copy
![](https://code.csdn.net/assets/CODE_ico.png)
![](https://code.csdn.net/assets/ico_fork.svg)
PHFetchResult *smartAlbums = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeSmartAlbum subtype:PHAssetCollectionSubtypeAlbumRegular options:nil];
[smartAlbums enumerateObjectsUsingBlock:^(PHAssetCollection * _Nonnull collection, NSUInteger idx, BOOLBOOL *stop) {
NSLog(@"相册名字:%@", collection.localizedTitle);
}];
智能相册的title不出意外都是英文,下面提供一个对应的中文名
[objc] view
plain copy
![](https://code.csdn.net/assets/CODE_ico.png)
![](https://code.csdn.net/assets/ico_fork.svg)
- (NSString *)transformAblumTitle:(NSString *)title
{
if ([title isEqualToString:@"Slo-mo"]) {
return @"慢动作";
} else if ([title isEqualToString:@"Recently Added"]) {
return @"最近添加";
} else if ([title isEqualToString:@"Favorites"]) {
return @"最爱";
} else if ([title isEqualToString:@"Recently Deleted"]) {
return @"最近删除";
} else if ([title isEqualToString:@"Videos"]) {
return @"视频";
} else if ([title isEqualToString:@"All Photos"]) {
return @"所有照片";
} else if ([title isEqualToString:@"Selfies"]) {
return @"自拍";
} else if ([title isEqualToString:@"Screenshots"]) {
return @"屏幕快照";
} else if ([title isEqualToString:@"Camera Roll"]) {
return @"相机胶卷";
}
return nil;
}
plain copy
![](https://code.csdn.net/assets/CODE_ico.png)
![](https://code.csdn.net/assets/ico_fork.svg)
PHFetchResult *userAlbums = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeAlbum subtype:PHAssetCollectionSubtypeSmartAlbumUserLibrary options:nil];
[userAlbums enumerateObjectsUsingBlock:^(PHAssetCollection * _Nonnull collection, NSUInteger idx, BOOLBOOL * _Nonnull stop) {
NSLog(@"相册名字:%@", collection.localizedTitle);
}];
plain copy
![](https://code.csdn.net/assets/CODE_ico.png)
![](https://code.csdn.net/assets/ico_fork.svg)
#pragma mark - 获取指定相册内的所有图片
- (NSArray<PHAsset *> *)getAssetsInAssetCollection:(PHAssetCollection *)assetCollection ascending:(BOOL)ascending
{
NSMutableArray<PHAsset *> *arr = [NSMutableArray array];
PHFetchResult *result = [self fetchAssetsInAssetCollection:assetCollection ascending:ascending];
[result enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOLBOOL * _Nonnull stop) {
[arr addObject:obj];//这个obj即PHAsset对象
}];
return arr;
}
plain copy
![](https://code.csdn.net/assets/CODE_ico.png)
![](https://code.csdn.net/assets/ico_fork.svg)
PHImageRequestOptions *option = [[PHImageRequestOptions alloc] init];
option.networkAccessAllowed = NO;
option.synchronous = YES;
__block BOOL isInLocalAblum = YES;
[[PHCachingImageManager defaultManager] requestImageDataForAsset:asset options:option resultHandler:^(NSData * _Nullable imageData, NSString * _Nullable dataUTI, UIImageOrientation orientation, NSDictionary * _Nullable info) {
isInLocalAblum = imageData ? YES : NO;
}];
return isInLocalAblum;
github地址:https://github.com/longitachi/ZLPhotoBrowser 喜欢的朋友可以给个star
下载的朋友建议去Git上下载,由于csdn的资源不支持实施更改,git上将持续更新
废话不多说,来干货
以下操作都需要导入<Photos/Photos.h>头文件
1.判断相册访问权限
首先我们访问相册,肯定有需要判断是否有访问权限的时候,然后做出相应的操作[objc] view
plain copy
![](https://code.csdn.net/assets/CODE_ico.png)
PHAuthorizationStatus status = [PHPhotoLibrary authorizationStatus];
if (status == PHAuthorizationStatusRestricted ||
status == PHAuthorizationStatusDenied) {
// 这里便是无访问权限
}
2.实时监听相册内部图片变化
[objc] viewplain copy
![](https://code.csdn.net/assets/CODE_ico.png)
[[PHPhotoLibrary sharedPhotoLibrary] registerChangeObserver:self];
当然,这个"self"是要遵守 PHPhotoLibraryChangeObserver 协议的
回调方法如下,不过这个地方是有一个坑的,就是这个回调是在一个子线程里面,如果你想要对UI进行操作的话,则必须回调主线程
[objc] view
plain copy
![](https://code.csdn.net/assets/CODE_ico.png)
//相册变化回调
- (void)photoLibraryDidChange:(PHChange *)changeInstance
{
dispatch_sync(dispatch_get_main_queue(), ^{
// your codes
});
}
3.读取相册内所有图片资源
对相册资源的相关操作,apple多都放在了 PHAsset内[objc] view
plain copy
![](https://code.csdn.net/assets/CODE_ico.png)
#pragma mark - 获取相册内所有照片资源
- (NSArray<PHAsset *> *)getAllAssetInPhotoAblumWithAscending:(BOOL)ascending
{
NSMutableArray<PHAsset *> *assets = [NSMutableArray array];
PHFetchOptions *option = [[PHFetchOptions alloc] init];
//ascending 为YES时,按照照片的创建时间升序排列;为NO时,则降序排列
option.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"creationDate" ascending:ascending]];
PHFetchResult *result = [PHAsset fetchAssetsWithMediaType:PHAssetMediaTypeImage options:option];
[result enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOLBOOL * _Nonnull stop) {
PHAsset *asset = (PHAsset *)obj;
NSLog(@"照片名%@", [asset valueForKey:@"filename"]);
[assets addObject:asset];
}];
return assets;
}
4.根据获取的PHAsset对象,解析图片
[objc] viewplain copy
![](https://code.csdn.net/assets/CODE_ico.png)
PHImageRequestOptions *option = [[PHImageRequestOptions alloc] init];
//仅显示缩略图,不控制质量显示
/**
PHImageRequestOptionsResizeModeNone,
PHImageRequestOptionsResizeModeFast, //根据传入的size,迅速加载大小相匹配(略大于或略小于)的图像
PHImageRequestOptionsResizeModeExact //精确的加载与传入size相匹配的图像
*/
option.resizeMode = PHImageRequestOptionsResizeModeFast;
option.networkAccessAllowed = YES;
//param:targetSize 即你想要的图片尺寸,若想要原尺寸则可输入PHImageManagerMaximumSize
[[PHCachingImageManager defaultManager] requestImageForAsset:asset targetSize:size contentMode:PHImageContentModeAspectFit options:option resultHandler:^(UIImage * _Nullable image, NSDictionary * _Nullable info) {
//解析出来的图片
}];
5.获取所有智能相册(即默认的,如“所有照片”“屏幕快照”等)
[objc] viewplain copy
![](https://code.csdn.net/assets/CODE_ico.png)
PHFetchResult *smartAlbums = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeSmartAlbum subtype:PHAssetCollectionSubtypeAlbumRegular options:nil];
[smartAlbums enumerateObjectsUsingBlock:^(PHAssetCollection * _Nonnull collection, NSUInteger idx, BOOLBOOL *stop) {
NSLog(@"相册名字:%@", collection.localizedTitle);
}];
智能相册的title不出意外都是英文,下面提供一个对应的中文名
[objc] view
plain copy
![](https://code.csdn.net/assets/CODE_ico.png)
- (NSString *)transformAblumTitle:(NSString *)title
{
if ([title isEqualToString:@"Slo-mo"]) {
return @"慢动作";
} else if ([title isEqualToString:@"Recently Added"]) {
return @"最近添加";
} else if ([title isEqualToString:@"Favorites"]) {
return @"最爱";
} else if ([title isEqualToString:@"Recently Deleted"]) {
return @"最近删除";
} else if ([title isEqualToString:@"Videos"]) {
return @"视频";
} else if ([title isEqualToString:@"All Photos"]) {
return @"所有照片";
} else if ([title isEqualToString:@"Selfies"]) {
return @"自拍";
} else if ([title isEqualToString:@"Screenshots"]) {
return @"屏幕快照";
} else if ([title isEqualToString:@"Camera Roll"]) {
return @"相机胶卷";
}
return nil;
}
6.获取所有用户创建的相册
[objc] viewplain copy
![](https://code.csdn.net/assets/CODE_ico.png)
PHFetchResult *userAlbums = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeAlbum subtype:PHAssetCollectionSubtypeSmartAlbumUserLibrary options:nil];
[userAlbums enumerateObjectsUsingBlock:^(PHAssetCollection * _Nonnull collection, NSUInteger idx, BOOLBOOL * _Nonnull stop) {
NSLog(@"相册名字:%@", collection.localizedTitle);
}];
7.获取每个相册下的所有照片对象(PHAsset)
[objc] viewplain copy
![](https://code.csdn.net/assets/CODE_ico.png)
#pragma mark - 获取指定相册内的所有图片
- (NSArray<PHAsset *> *)getAssetsInAssetCollection:(PHAssetCollection *)assetCollection ascending:(BOOL)ascending
{
NSMutableArray<PHAsset *> *arr = [NSMutableArray array];
PHFetchResult *result = [self fetchAssetsInAssetCollection:assetCollection ascending:ascending];
[result enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOLBOOL * _Nonnull stop) {
[arr addObject:obj];//这个obj即PHAsset对象
}];
return arr;
}
8.验证该图片是否在本地(若开启了iCloud照片存储,则图片会定时上传到网上,本地不存在)
[objc] viewplain copy
![](https://code.csdn.net/assets/CODE_ico.png)
PHImageRequestOptions *option = [[PHImageRequestOptions alloc] init];
option.networkAccessAllowed = NO;
option.synchronous = YES;
__block BOOL isInLocalAblum = YES;
[[PHCachingImageManager defaultManager] requestImageDataForAsset:asset options:option resultHandler:^(NSData * _Nullable imageData, NSString * _Nullable dataUTI, UIImageOrientation orientation, NSDictionary * _Nullable info) {
isInLocalAblum = imageData ? YES : NO;
}];
return isInLocalAblum;
相关文章推荐
- iOS8.0 使用Photos.framework对相册的常用操作
- iOS8.0 使用Photos.framework对相册的常用操作
- JS 操作IE游览器常用函数使用说明
- ruby操作常用数据库 - 使用DBI[翻译 转帖]
- vim使用系列之二——总结一下自己常用的VIM操作
- Linux/Unix下Shell快捷键操作大集合及部分Bash使用技巧-另附Ubuntu常用快捷键
- 使用事务操作SQLite数据库和一些常用的SQL语句
- 使用WMI操作AD时常用的属性
- c++builder使用Map保存数据库表的id和Map的常用操作
- VB使用ADODB操作数据库的常用方法
- svn使用教程-windows和Linux下常用操作总结-ghost1236
- 【VIM使用技巧】常用操作和技巧
- 常用的Ajax异步操作范例,使用Ajax验证用户名是否已存在
- Javascript里使用Dom操作Xml笔记之常用函数[转]
- VB使用ADODB操作数据库的常用方法
- 使用WMI操作AD时常用的属性
- VIM 里使用 map/vmap 映射常用操作序列
- Memcached 安装、使用(Python操作)以及常用方法
- VB使用ADODB操作数据库的常用方法
- Linux/Unix下Shell快捷键操作大集合及部分Bash使用技巧-另附Ubuntu常用快捷键