iOS8下获取相册所有图片
2016-01-05 21:14
996 查看
http://bluereader.org/article/6379389
iOS8以前我们可以使用AssetsLibrary来获取系统相册中的所有照片,但是升级了iOS8之后,发现好多应用自定义的XXImagePickerController都无法获取到所有的照片了,这时候就要使用AssetsLibrary+Photos来解决问题了。
Photos是iOS8提供的一组操作照片的方法,使用Photos你可以操作照片应用管理的照片/视频,包括来自iCloud的照片,你也可以通过Photos展示、编辑照片,操作相薄、时刻以及iCloud共享的照片等,简而言之,iOS几乎所有原生的照片应用能做的你都可以使用Photos来自定义。
Photos下提供的功能很多,这篇博客重点介绍如何使用Photos获取系统的所有图片,有关其它Photos提供的功能,大家可以参考Photos官方文档,里面有更详细的介绍。
和使用其他framework一样,我们首先需要添加Photos.framework,然后在使用的地方import相关的头文件
要查看所有的照片,我们需要用到以下几个类
PHAsset
PHFetchOptions
PHFetchResult
PHImageManager
PHImageRequestOptions
PHAsset本身是图片的实体,包含了图片的各种信息,并且提供了一系列的获取图片的类方法,我们想获取所有的图片,就需要使用PHAsset提供的方法
PHFetchOptions为获取时候的一些配置,我们可以设置获取的条件等。获取的时候,如果该参数为空,则使用系统的默认值,当我们调用如上所示方法获取时,可以直接传nil。
PHFetchResult为通过PHAsset等获取到的结果,结果中包含我们要获取内容(图片或者视频)的实体对象PHAsset集合。我们可以看到,PHFetchResult实现了NSFastEnumeration协议,其提供了类似数组(immutable)的所有操作,文档中有指出,PHFetchResult还自身提供按需所取的优化,保证处理大量数据时达到最佳效果。我们还可以使用PHFetchResult的如下方法
来获取某种类型资源的数目。
PHImageManager提供了我们加载图片的方法,这个加载图片也是做过缓存优化的,比如我们访问过一次图片的信息,下一次再访问该图片的时候会比较快,我们也可以利用PHCachingImageManager的子类来自己提供的缓存方法。同时PHImageManager
会根据PHImageRequestOptions的配置来获取当前的图片,并且同时提供同步和异步的方法来获取最接近某个targetSize的图片。
当我们使用Photos来获取照片的时候,我们首先需要使用PHAsset和PHFetchOptions来得到PHFetchResult,代码如下所示
[PHFetchResult]
PHFetchResult则是一系列图片资源的集合,我们可以利用它提供的遍历方法,来访问我们获取到的所有照片,代码所示是把PHAsset添加到列表的数据源中。
[Enumeration]
最后,我们利用我们数据源中的PHAsset,然后通过PHImageManager来获取图片。
[GetImage]
由于获取图片的方法默认是异步的,所以代码中提供了取消上次加载图片的方法。有关PHImageManager 的其他内容,大家可以自行查看文档。这里就完成了从Photos中获取所有图片的方法。
STKitDemo中也提供了STImagePickerController,当然目前STKit还由于一些不稳定因素没有public,大家可以先行体验一下。STKitDemo下载地址。操作步骤,进入主页之后点击图片选择。
iOS8以前我们可以使用AssetsLibrary来获取系统相册中的所有照片,但是升级了iOS8之后,发现好多应用自定义的XXImagePickerController都无法获取到所有的照片了,这时候就要使用AssetsLibrary+Photos来解决问题了。
Photos是iOS8提供的一组操作照片的方法,使用Photos你可以操作照片应用管理的照片/视频,包括来自iCloud的照片,你也可以通过Photos展示、编辑照片,操作相薄、时刻以及iCloud共享的照片等,简而言之,iOS几乎所有原生的照片应用能做的你都可以使用Photos来自定义。
Photos下提供的功能很多,这篇博客重点介绍如何使用Photos获取系统的所有图片,有关其它Photos提供的功能,大家可以参考Photos官方文档,里面有更详细的介绍。
和使用其他framework一样,我们首先需要添加Photos.framework,然后在使用的地方import相关的头文件
#import <Photos/Photos.h>
要查看所有的照片,我们需要用到以下几个类
PHAsset
PHFetchOptions
PHFetchResult
PHImageManager
PHImageRequestOptions
PHAsset本身是图片的实体,包含了图片的各种信息,并且提供了一系列的获取图片的类方法,我们想获取所有的图片,就需要使用PHAsset提供的方法
+ (PHFetchResult *)fetchAssetsWithMediaType:(PHAssetMediaType)mediaType options:(PHFetchOptions *)options;其中,mediaType包括图片,视频等。
PHFetchOptions为获取时候的一些配置,我们可以设置获取的条件等。获取的时候,如果该参数为空,则使用系统的默认值,当我们调用如上所示方法获取时,可以直接传nil。
PHFetchResult为通过PHAsset等获取到的结果,结果中包含我们要获取内容(图片或者视频)的实体对象PHAsset集合。我们可以看到,PHFetchResult实现了NSFastEnumeration协议,其提供了类似数组(immutable)的所有操作,文档中有指出,PHFetchResult还自身提供按需所取的优化,保证处理大量数据时达到最佳效果。我们还可以使用PHFetchResult的如下方法
- (NSUInteger)countOfAssetsWithMediaType:(PHAssetMediaType)mediaType;
来获取某种类型资源的数目。
PHImageManager提供了我们加载图片的方法,这个加载图片也是做过缓存优化的,比如我们访问过一次图片的信息,下一次再访问该图片的时候会比较快,我们也可以利用PHCachingImageManager的子类来自己提供的缓存方法。同时PHImageManager
会根据PHImageRequestOptions的配置来获取当前的图片,并且同时提供同步和异步的方法来获取最接近某个targetSize的图片。
当我们使用Photos来获取照片的时候,我们首先需要使用PHAsset和PHFetchOptions来得到PHFetchResult,代码如下所示
[PHFetchResult]
1 2 3 4 5 6 7 | if (NSClassFromString(@"PHFetchResult")) { PHFetchOptions *fetchOptions = [[PHFetchOptions alloc] init]; PHFetchResult *fetchResult = [PHAsset fetchAssetsWithMediaType:PHAssetMediaTypeImage options:fetchOptions]; if ([fetchResult countOfAssetsWithMediaType:PHAssetMediaTypeImage] > 0) { self.fetchResult = fetchResult; } } |
[Enumeration]
1 2 3 4 5 6 78 | NSIndexSet *indexSet = [[NSIndexSet alloc] initWithIndexesInRange:range]; [self.fetchResult enumerateObjectsAtIndexes:indexSet options:0 usingBlock:^(id obj, NSUInteger idx, BOOL *stop) { if (obj) { [self.dataSource addObject:obj]; } }]; |
[GetImage]
1 2 3 4 5 6 78 | [[PHImageManager defaultManager] cancelImageRequest:(PHImageRequestID)photoCell.requestID]; static PHImageRequestOptions *requestOptions; if (!requestOptions) { requestOptions = [[PHImageRequestOptions alloc] init]; requestOptions.deliveryMode = PHImageRequestOptionsDeliveryModeOpportunistic; requestOptions.resizeMode = PHImageRequestOptionsResizeModeFast; } photoCell.requestID = [[PHImageManager defaultManager] requestImageForAsset:asset targetSize:CGSizeMake(CGRectGetWidth(photoCell.thumbView.frame) * [UIScreen mainScreen].scale, CGRectGetHeight(photoCell.thumbView.frame) * [UIScreen mainScreen].scale) contentMode:PHImageContentModeAspectFill options:requestOptions resultHandler:^(UIImage *result, NSDictionary *info) { photoCell.thumbView.image = result; }]; |
STKitDemo中也提供了STImagePickerController,当然目前STKit还由于一些不稳定因素没有public,大家可以先行体验一下。STKitDemo下载地址。操作步骤,进入主页之后点击图片选择。
相关文章推荐
- iOS 获取图像的方式与坑点
- iOS开发~CocoaPods使用详细说明
- iOS屏幕适配-约束
- iOS深入学习(使用CocoaPods进行第三方资源管理)(转)
- ios textField限制只能输入一定长度的字符
- iOS页面间传值的两种方式
- iOS - 内存管理
- ios distill failed for unknow reasons解决
- iOS开发NSTimer闪烁问题
- ios 大图 真机不显示的问题
- iOS NSString的常用用法
- iOS设计模式——Category
- iOS图片高斯模糊 毛玻璃效果
- IOS OC声明变量在@interface括号中与使用@property的区别(转载)
- iOS开发之NSRunLoop概述
- iOS导航栏返回按钮
- iOS 用 AVPlayer 播放一个本地音频文件
- ios import和@class的区别
- iOS多线程之NSThread
- ios 自适应高度