iOS相册实现与AssetsLibrary框架使用
2015-09-24 15:05
567 查看
概述
在iOS中如果想要获取手机相册里面的图片或者视频的话就要用到系统自带的AssetsLibrary框架,
AssetsLibrary.framework中包含以下文件
#import <AssetsLibrary/ALAsset.h> #import <AssetsLibrary/ALAssetsFilter.h> #import <AssetsLibrary/ALAssetsGroup.h> #import <AssetsLibrary/ALAssetsLibrary.h> #import <AssetsLibrary/ALAssetRepresentation.h>
ALAsset.h
从本地相册获取的图片或者视频的对象都是
ALAsset类型的对象。
ALAssetsFilter
顾名思义是对本地所有资源的过滤筛选,可以选择只获取照片,只获取视频,或者获取所有的资源。
ALAssetsGroup
本地相册分组对象,本地有多少个相薄就会有几个
ALAssetsGroup类型的对象。
ALAssetsLibrary
本地资源库对象
ALAssetRepresentation
ALAssetRepresentation对象来获取视频或者图片的url,文件名,二进制数据,封面缩略图等
AssetsLibrary使用
使用前导入AssetsLibrary.framework
#import <AssetsLibrary/AssetsLibrary.h>
获取本地所有相薄
初始化ALAssetsLibrary对象并使用下面的方法来获取本地所有相薄
- (void)enumerateGroupsWithTypes:(ALAssetsGroupType)types usingBlock:(ALAssetsLibraryGroupsEnumerationResultsBlock)enumerationBlock failureBlock:(ALAssetsLibraryAccessFailureBlock)failureBlock
types相薄分组类型
ALAssetsGroupType苹果官方文档定义如下
enum { ALAssetsGroupLibrary NS_ENUM_DEPRECATED_IOS(4_0, 9_0) = (1 << 0), // The Library group that includes all assets. ALAssetsGroupAlbum NS_ENUM_DEPRECATED_IOS(4_0, 9_0) = (1 << 1), // All the albums synced from iTunes or created on the device. ALAssetsGroupEvent NS_ENUM_DEPRECATED_IOS(4_0, 9_0) = (1 << 2), // All the events synced from iTunes. ALAssetsGroupFaces NS_ENUM_DEPRECATED_IOS(4_0, 9_0) = (1 << 3), // All the faces albums synced from iTunes. ALAssetsGroupSavedPhotos NS_ENUM_DEPRECATED_IOS(4_0, 9_0) = (1 << 4), // The Saved Photos album. #if __IPHONE_5_0 <= __IPHONE_OS_VERSION_MAX_ALLOWED ALAssetsGroupPhotoStream NS_ENUM_DEPRECATED_IOS(5_0, 9_0) = (1 << 5), // The PhotoStream album. #endif ALAssetsGroupAll NS_ENUM_DEPRECATED_IOS(4_0, 9_0) = 0xFFFFFFFF, // The same as ORing together all the available group types, };
enumerationBlock对本地相薄进行遍历并返回遍历结果
ALAssetsLibraryGroupsEnumerationResultsBlock定义如下
ALAssetsLibraryGroupsEnumerationResultsBlock resultBlock = ^(ALAssetsGroup *group,BOOL *stop) {};
failureBlock遍历失败
ALAssetsLibraryAccessFailureBlock定义如下
ALAssetsLibraryAccessFailureBlock failureBlock = ^(NSError *error) {};
代码示例
typedef void (^albumGroupsBlock)(NSMutableArray *groups); -(void)setupAlbumGroups:(albumGroupsBlock)albumGroups //获取所有相薄成功后回调 { NSMutableArray *groups = @[].mutableCopy; //所有相薄数组 ALAssetsFilter* assstsFilter = [ALAssetsFilter allAssets]; //筛选器获取所有资源 ALAssetsLibraryGroupsEnumerationResultsBlock resultBlock = ^(ALAssetsGroup *group, BOOL *stop){ //每次遍历成功后回调 if (group) { [group setAssetsFilter:assstsFilter]; NSInteger groupType = [[group valueForProperty:ALAssetsGroupPropertyType] integerValue]; if (groupType == ALAssetsGroupSavedPhotos) { [groups insertObject:group atIndex:0]; //默认相机胶卷放入数组第一位 } else { if (group.numberOfAssets>0) { [groups addObject:group]; } } } else //当返回的group为nil表示已经遍历结束 { if (albumGroups) { albumGroups([groups copy]); } } }; ALAssetsLibraryAccessFailureBlock failureBlock = ^(NSError *error) { if (albumGroups) { //遍历失败回调 albumGroups([groups copy]); } }; ; [[[ALAssetsLibrary alloc] init] enumerateGroupsWithTypes:ALAssetsGroupAll usingBlock:resultBlock failureBlock:failureBlock]; //开始遍历 }
获取本地每个相薄中的资源
初始化ALAssetsGroup对象并使用下面的方法来获取相薄中的资源
- (void)enumerateAssetsWithOptions:(NSEnumerationOptions)options usingBlock:(ALAssetsGroupEnumerationResultsBlock)enumerationBlock
options遍历相薄中资源的顺序
NSEnumerationOptions定义如下
typedef NS_OPTIONS(NSUInteger, NSEnumerationOptions) { NSEnumerationConcurrent = (1UL << 0), // 并发读取相册中的资源,顺序不确定 NSEnumerationReverse = (1UL << 1), //倒序读取相册中的资源 };
enumerationBlock对相薄里资源进行遍历并返回遍历结果
ALAssetsGroupEnumerationResultsBlock resultBlock = ^(ALAsset *asset, NSUInteger index, BOOL *stop) {};
代码示例
typedef void (^albumAssetsBlock)(NSMutableArray *assets); -(void)setupAlbumAssets:(ALAssetsGroup *)group withAssets:(albumAssetsBlock)albumAssets { NSMutableArray *assets = @[].mutableCopy; //相薄中所有资源数组 ALAssetsFilter* assstsFilter = [ALAssetsFilter allAssets]; //筛选器获取所有资源 [group setAssetsFilter:assstsFilter]; //相册内资源总数 NSInteger assetCount = [group numberOfAssets]; //相薄中资源总数 ALAssetsGroupEnumerationResultsBlock resultBlock = ^(ALAsset *asset, NSUInteger index, BOOL *stop) { //资源为ALAsset类型对象 if (asset) { [assets addObject:asset]; NSString *assetType = [asset valueForProperty:ALAssetPropertyType]; if ([assetType isEqualToString:ALAssetTypePhoto]) { //资源类型为图片 } else if ([assetType isEqualToString:ALAssetTypeVideo]) { //资源类型为视频 } } else if (assets.count >= assetCount) { if (albumAssets) { albumAssets([assets copy]); } }; }; [group enumerateAssetsWithOptions:NSEnumerationReverse usingBlock:resultBlock]; //开始遍历相薄中资源 }
实现效果
示例代码
https://github.com/GGGHub/AlbumPicker
相关文章推荐
- iOS 8使用Touch ID进行身份认证
- 3-redundancy protocol-HSRP Configuration on Cisco IOS
- ios- 死锁
- iOS9之Bitcode
- iOS 代码实践总结
- iOS--持续存储-简介
- EXC_BAD_ACCESS (code =2,address=0x6f7fffbc)
- ios-信号量
- iOS开发多线程篇简介
- ios中摄像头/相册获取图片,压缩图片,上传服务器方法总结
- IOS安装CocoaPods完整流程
- iOS Core Image 复杂的滤镜
- 整理iOS9适配中出现的坑(图文)
- ios时间戳13位转换
- ios-锁机制-条件锁的使用
- iOS9对SDK的影响(iOS9适配必看)
- ios学习笔记——数据持久化
- iOS8 真机调试流程和iOS9免证书调试(一)
- iOS开发:一个高仿美团的团购ipad客户端的设计和实现(功能:根据拼音进行检索并展示数据,离线缓存团购数据,浏览记录与收藏记录的批量删除等)
- Lock Screen Rotation in iOS 8 旋转