概述


在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相册实现与AssetsLibrary框架使用的更多相关文章

  1. iOS开发-常用第三方开源框架介绍(你了解的ios只是冰山一角)--(转)

    图像: 1.图片浏览控件MWPhotoBrowser 实现了一个照片浏览器类似 iOS 自带的相册应用,可显示来自手机的图片或者是网络图片,可自动从网络下载图片并进行缓存.可对图片进行缩放等操作. 下 ...

  2. iOS开发-常用第三方开源框架介绍

    iOS开发-常用第三方开源框架介绍 图像: 1.图片浏览控件MWPhotoBrowser        实现了一个照片浏览器类似 iOS 自带的相册应用,可显示来自手机的图片或者是网络图片,可自动从网 ...

  3. iOS相册中图片按照时间排序

    ios相册默认是按照时间从过去到现在排列,图片顺序有正序和逆序,group可以用以下方法来选择顺序 /** @param NSIndexSet 需要获取的相册中图片范围 @param NSEnumer ...

  4. iOS相册、相机、通讯录权限获取

    iOS相册.相机.通讯录权限获取 说明 这是本人写的一个工具,用以便利的处理各种权限获取的操作,目前提供相册.照相机.通讯录的权限获取操作,参考了 http://www.jianshu.com/p/a ...

  5. iOS开发之常用第三方框架(下载地址,使用方法,总结)

    iOS开发之常用第三方框架(下载地址,使用方法,总结) 说句实话,自学了这么久iOS,如果说我不知道的但是又基本上都摸遍了iOS相关知识,但是每次做项目的时候,遇到难一点的地方或者没试过的东西就闷了. ...

  6. Android &Swift iOS开发:语言与框架对比

    转载自:http://www.infoq.com/cn/articles/from-android-to-swift-ios?utm_campaign=rightbar_v2&utm_sour ...

  7. iOS 相册和网络图片的存取

    iOS 相册和网络图片的存取 保存 UIImage 到相册 UIKit UIKit 中一个古老的方法,Objective-C 的形式 void UIImageWriteToSavedPhotosAlb ...

  8. iOS Swift WisdomHUD 提示界面框架

    iOS Swift WisdomHUD 提示界面框架  Framework Use profile(应用简介) 一:WisdomHUD简介 今天给大家介绍一款iOS的界面显示器:WisdomHUD,W ...

  9. ios系统架构及常用框架

    1.iOS基于UNIX系统,因此从系统的稳定性上来说它要比其他操作系统的产品好很多 2.iOS的系统架构分为四层,由上到下一次为:可触摸层(Cocoa Touch layer).媒体层(Media l ...

随机推荐

  1. Linux 端口 为什么要有端口

    ip能锁定一台物理机器,对应着一张网卡,外界发来的数据包网卡都会接收.但是问题来了,网卡给程序提供了接口,你监听一下我,要是有消息来了,我就转发给你.这样应用程序就能收到数据了.但是问题来了,程序A和 ...

  2. wpf Textbox 点击选中全部文本

    用法:依赖属性 SelectTextOnFocus.Active = True public class SelectTextOnFocus : DependencyObject { public s ...

  3. SQL SERVER读书笔记:TempDB

    每次SQL SERVER启动的时候,会重新创建. 用于 0.临时表 1.排序 2.连接(merge join,hash join) 3.行版本控制 临时表与表变量的区别: 1)表变量是存储在内存中的, ...

  4. HDU 4386 Quadrilateral(数学啊)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4386 Problem Description One day the little Jack is p ...

  5. Hdu-6242 2017CCPC-哈尔滨站 M.Geometry Problem 计算几何 随机

    题面 题意:给你n个点,让你找到一个圆,输出圆心,和半径,使得有超过一半的点刚好在圆上.n<=1e5,题目保证了有解 题解:刚开始看着很不可做的样子,但是多想想,三点确定一个圆,三点啊! 现在有 ...

  6. django 实现websocket

    一.简述:django实现websocket,之前django-websocket退出到3.0之后,被废弃.官方推荐大家使用channels. channels通过升级http协议 升级到websoc ...

  7. Bootstrap 模态框使用

    <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...

  8. 浅析CLR的GC(垃圾回收器)

    文章目录: 了解托管堆和GC GC高效的处理方式—代 特殊类型的清理 手动监控和控制对象生命周期 1.了解托管堆和GC 在面向对象环境中,每一个类型都代表了一种资源.我们要使用这些资源,就要为这些代表 ...

  9. AngularJs轻松入门

    AngularJs轻松入门系列博文:http://blog.csdn.net/column/details/angular.html AngularJs轻松入门(一)创建第一个应用 AngularJs ...

  10. **PCD数据获取:Kinect+OpenNI+PCL对接(代码)

    前言: PCL使用点云作为数据格式,Kinect可以直接作为三维图像的数据源产生三维数据,其中的桥梁是OpenNI和PrimeSense.为了方便地使用Kinect的数据,还是把OpenNI获取的基础 ...