自己最近抽空写了一个相册多选框架,用到对一些对相册相关的操作,使用的便是iOS8.0之后,apple推出的新框架 Photos.framework

github地址:https://github.com/longitachi/ZLPhotoBrowser 喜欢的朋友可以给个star

下载的朋友建议去git上下载,由于csdn的资源不支持实施更改,git上将持续更新

废话不多说,来干货

以下操作都需要导入<Photos/Photos.h>头文件

1.判断相册访问权限

首先我们访问相册,肯定有需要判断是否有访问权限的时候,然后做出相应的操作

PHAuthorizationStatus status = [PHPhotoLibrary authorizationStatus];
if (status == PHAuthorizationStatusRestricted ||status == PHAuthorizationStatusDenied) {// 这里便是无访问权限
}

2.实时监听相册内部图片变化

[[PHPhotoLibrary sharedPhotoLibrary] registerChangeObserver:self];

当然,这个"self"是要遵守 PHPhotoLibraryChangeObserver 协议的

回调方法如下,不过这个地方是有一个坑的,就是这个回调是在一个子线程里面,如果你想要对UI进行操作的话,则必须回调主线程

//相册变化回调
- (void)photoLibraryDidChange:(PHChange *)changeInstance
{dispatch_sync(dispatch_get_main_queue(), ^{// your codes});
}

3.读取相册内所有图片资源

对相册资源的相关操作,apple多都放在了 PHAsset内
#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, BOOL * _Nonnull stop) {PHAsset *asset = (PHAsset *)obj;NSLog(@"照片名%@", [asset valueForKey:@"filename"]);[assets addObject:asset];}];return assets;
}

4.根据获取的PHAsset对象,解析图片

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.获取所有智能相册(即默认的,如“所有照片”“屏幕快照”等)

PHFetchResult *smartAlbums = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeSmartAlbum subtype:PHAssetCollectionSubtypeAlbumRegular options:nil];
[smartAlbums enumerateObjectsUsingBlock:^(PHAssetCollection * _Nonnull collection, NSUInteger idx, BOOL *stop) {NSLog(@"相册名字:%@", collection.localizedTitle);
}];


智能相册的title不出意外都是英文,下面提供一个对应的中文名
- (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;
}

在项目plist配置文件中添加如下键,值设为YES,即可自动匹配手机系统语言,返回相册名字。不需要进行上列判断

Localized resources can be mixed YES
//或者右键plist文件Open As->Source Code 添加
<key>CFBundleAllowMixedLocalizations</key>
<true/>

6.获取所有用户创建的相册

PHFetchResult *userAlbums = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeAlbum subtype:PHAssetCollectionSubtypeSmartAlbumUserLibrary options:nil];
[userAlbums enumerateObjectsUsingBlock:^(PHAssetCollection * _Nonnull collection, NSUInteger idx, BOOL * _Nonnull stop) {NSLog(@"相册名字:%@", collection.localizedTitle);
}];

7.获取每个相册下的所有照片对象(PHAsset)

#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, BOOL * _Nonnull stop) {[arr addObject:obj];//这个obj即PHAsset对象}];return arr;
}

8.验证该图片是否在本地(若开启了iCloud照片存储,则图片会定时上传到网上,本地不存在)

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;

9.获取LivePhoto
PHLivePhotoRequestOptions *option = [[PHLivePhotoRequestOptions alloc] init];option.version = PHImageRequestOptionsVersionCurrent;option.deliveryMode = PHImageRequestOptionsDeliveryModeOpportunistic;option.networkAccessAllowed = YES;[[PHCachingImageManager defaultManager] requestLivePhotoForAsset:asset targetSize:PHImageManagerMaximumSize contentMode:PHImageContentModeAspectFit options:option resultHandler:^(PHLivePhoto * _Nullable livePhoto, NSDictionary * _Nullable info) {if (completion) completion(livePhoto, info);}];

播放LivePhoto则需要借助系统框架 PhotosUI.framework,我们直接把上边block中请求的PHLivePhoto类型对象赋值给 PHLivePhotoView 类的UI即可, 调用 startPlaybackWithStyle: 方法即可进行播放


10.获取Video
[[PHCachingImageManager defaultManager] requestPlayerItemForVideo:asset options:nil resultHandler:^(AVPlayerItem * _Nullable playerItem, NSDictionary * _Nullable info) {if (completion) completion(playerItem, info);}];

播放视频则需要使用 AVPlayerLayer,使用对应方法播放即可

iOS8.0 使用Photos.framework对相册的常用操作相关推荐

  1. iOS开发------简单实现图片多选功能(Photos.framework篇)

    Photos.framework是iOS8后苹果推出的一套替代AssetsLibrary.framework获取相册资源的原生库,至于AL库,欢迎大家给博文iOS开发--简单实现图片多选功能(Asse ...

  2. iOS8开发之 PHAsset 保存图片到相册(相机胶卷) 详解一

    http://segmentfault.com/a/1190000003950935 平时开发APP时难免会遇到保存图片到相册的相关操作,具体我么可以直接保存到系统的相机胶卷, 也可以自定义相册保存图 ...

  3. iOS8开发之 PHAsset 保存图片到相册(相机胶卷) 详解三

    http://blog.csdn.net/jerrychenly/article/details/44858355 解决iOS8下ALAssetsLibrary创建相册的bug 说到ALAssetsL ...

  4. iOS:Photos/Photos.h获取相册视频以及图片

    转自:http://www.jianshu.com/p/ea0274a33209 因为项目的需求,要捕获相册中的视频与图片,之前也对之尚未做过什么探讨,仅知道iOS8.0后,苹果推出了新的相册管理的包 ...

  5. 有关C# 8.0、.NET Framework 4.8与NET Standard 2.1的一个说明

    早在本月12日,微软官方的.NET Blog发布了一篇名为<Building C# 8.0>的文章,介绍了很多C# 8.0的新特性.不过本文主要讨论的并不是C# 8.0的新特性,而是存在于 ...

  6. Net Framework 4.0 和.Net Framework 4.0 Client Profile

    Net Framework 4.0 和.Net Framework 4.0 Client Profile区别: .Net Framework 4.0毫无疑问就像是.Net Framework 2.0一 ...

  7. Entity Framework Core 3.0 和 Entity Framework 6.3 正式发布

    Entity Framework Core 3.0 和 Entity Framework 6.3 通用版发布了,接下来我们看看它的新内容: Entity Framework Core 3.0 EF C ...

  8. [转帖]2016年时的新闻:ASP.NET Core 1.0、ASP.NET MVC Core 1.0和Entity Framework Core 1.0

    ASP.NET Core 1.0.ASP.NET MVC Core 1.0和Entity Framework Core 1.0 http://www.cnblogs.com/webapi/p/5673 ...

  9. iOS 音视频之网络视频播放AVPlayerViewController(iOS8.0+使用)

    1.视频播放新功能 iOS8.0之后新增了AVPlayerViewController,集成了AVPlayer iOS9.0之后增加了快进和后退功能,播放视频特别方便,再也不用复杂地封装AVPlaye ...

最新文章

  1. 2019-11-09 正定矩阵的一些常见概念
  2. 线性代数学习资料汇编
  3. Log4j远程代码执行漏洞验证
  4. 自学python条件_自学Python2.8-条件(if、if...else)
  5. CSS之media Query
  6. 【Tensorflow】更新后报错 numpy.core.umath
  7. windows API 菜鸟学习之路(三)
  8. centos7 端口相关操作
  9. 一些有价值的数值公式(游戏)
  10. 大厂的 404 页面都长啥样?看到最后一个,我笑了。。。
  11. PHP 控制器怎么调接口,mvc控制器的访问与参数解析和API接口获取数据
  12. WSUS:数据库从WID 换成 SQLExpress
  13. 基于MATLAB的语音信号设计,基于MATLAB的语音信号处理系统设计
  14. sequelize时间自动格式化
  15. cf_Gym 101572 K.Kayaking Trip
  16. SQL 注入速查表大全
  17. doodoo.js配置教程 1
  18. 博客系统-写文章之富文本编辑器editor
  19. macOS下载【转载】
  20. java给图片、word、ppt、excel、pdf添加水印

热门文章

  1. Python---第8天---字符串
  2. BC35 RAI功能应用
  3. 动态渲染element组件el-table表头项+自定义el-table列表项
  4. 等额本金计算公式解析
  5. bit(比特)和byte(字节的关系)以及现实应用场景(存储单位和网速单位)
  6. uni-app 配置 以及 使用微信云函数
  7. 【深度学习】吴恩达深度学习-Course1神经网络与深度学习-第四周深度神经网络的关键概念编程(下)——深度神经网络用于图像分类:应用
  8. office2016 excel关闭受保护的视图
  9. 《算法笔记》10.5小节——图算法专题->最小生成树
  10. 15. Linux系统中的磁盘管理