使用AssetsLibrary.Framework创建多图片选择控制器(翻译)
系统的UIImagePickerController只能让用户选择单图片,而一般情况下,我们需要上传多张图片,这时应该可以同时选择多张图片,否则用户体验会很差。因此多图片选择器就诞生了。
在类库中,苹果为我们提供了一个AssetsLibrary.Framework的库,可以通过它获取设备里的图片和视频。在使用这个类库时, 我们需要导入,且<AssetsLibrary/AssetsLibrary.h>。然后我们可以使用它来获取不同组的枚举。

1 void (^assetGroupEnumerator)
2 (struct ALAssetsGroup *, BOOL *) = ^(ALAssetsGroup *group, BOOL *stop{
3 if(group != nil) {
4 [assetGroups addObject:group];
5 NSLog(@"Number of assets in group: %d",
6 [group numberOfAssets]);
7 }
8 };
9
10 assetGroups = [[NSMutableArray alloc] init];
11 ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];
12 NSUInteger groupTypes = ALAssetsGroupAll;
13
14 [library enumerateGroupsWithTypes:groupTypes
15 usingBlock:assetGroupEnumerator
16 failureBlock:^(NSError *error) {NSLog(@"A problem occurred");}];
17
18 NSLog(@"Asset groups: %@", assetGroups);
19 [library release];

1-8行,我们声明一个block,使用它来枚举所有asset group,然后将所有获取到的group放在NSMutableArray中。

1 void (^assetEnumerator)
2 (struct ALAsset *, NSUInteger, BOOL *) = ^(ALAsset *result, NSUInteger index, BOOL *stop) {
3 if(result != nil) {
4 if(![assetURLDictionaries containsObject:[result valueForProperty:ALAssetPropertyURLs]]) {
5 if(![[result valueForProperty:ALAssetPropertyType] isEqualToString:ALAssetTypeVideo]) {
6 [assetURLDictionaries addObject:[result valueForProperty:ALAssetPropertyURLs]];
7 [assets addObject:result];
8 }
9 }
10 }
11 };
12
13 assets = [[NSMutableArray alloc] init];
14 assetURLDictionaries = [[NSMutableArray alloc] init];
15
16 NSInteger indexOfExampleGallery = NSNotFound;
17 for (ALAssetsGroup *group in assetGroups) {
18 if ([[group valueForProperty:ALAssetsGroupPropertyName]
19 isEqualToString:@"ExampleGallery"])
20 indexOfExampleGallery = [assetGroups indexOfObject:group];
21 }
22
23 if (indexOfExampleGallery != NSNotFound) {
24 [[assetGroups objectAtIndex:indexOfExampleGallery]
25 enumerateAssetsUsingBlock:assetEnumerator];
26 NSLog(@"Assets %@", assets);
27 }
28 else
29 NSLog(@"Gallery 'ExampleGallery' not found on device.");

代码中的ELCImagePickerController就是使用这个库来完成同时选择多张图片,当然视频也可以。
ELCImagePickerController的使用

1 ELCAlbumPickerController *albumController = [[ELCAlbumPickerController alloc] initWithNibName:@"ELCAlbumPickerController" bundle:[NSBundle mainBundle]];
2 ELCImagePickerController *elcPicker = [[ELCImagePickerController alloc] initWithRootViewController:albumController];
3 [albumController setParent:elcPicker];
4 [elcPicker setDelegate:self];
5
6 ELCImagePickerDemoAppDelegate *app = (ELCImagePickerDemoAppDelegate *)[[UIApplication sharedApplication] delegate];
7 [app.viewController presentModalViewController:elcPicker animated:YES];


使用AssetsLibrary.Framework创建多图片选择控制器(翻译)的更多相关文章
- ASP.NET MVC with Entity Framework and CSS一书翻译系列文章之第六章:管理产品图片——多对多关系(上篇)
在这章中,我们将学习如何创建一个管理图片的新实体,如何使用HTML表单上传图片文件,并使用多对多关系将它们和产品关联起来,如何将图片存储在文件系统中.在这章中,我们还会学习更加复杂的异常处理,如何向模 ...
- ASP.NET MVC with Entity Framework and CSS一书翻译系列文章之第二章:利用模型类创建视图、控制器和数据库
在这一章中,我们将直接进入项目,并且为产品和分类添加一些基本的模型类.我们将在Entity Framework的代码优先模式下,利用这些模型类创建一个数据库.我们还将学习如何在代码中创建数据库上下文类 ...
- 《Entity Framework 6 Recipes》中文翻译系列 目录篇 -持续更新
为了方便大家的阅读和学习,也是响应网友的建议,在这里为这个系列做一个目录.在目录开始这前,我先来回答之前遇到的几个问题. 1.为什么要学习EF? 这个问题很简单,项目需要.这不像学校,没人强迫你学习! ...
- 《Entity Framework 6 Recipes》中文翻译 ---- 系列教程
为了方便大家的阅读和学习,也是响应网友的建议,在这里为这个系列做一个目录.在目录开始这前,我先来回答之前遇到的几个问题. 1.为什么要学习EF? 这个问题很简单,项目需要.这不像学校,没人强迫你学习! ...
- [Android]使用Dagger 2依赖注入 - 图表创建的性能(翻译)
以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/5098943.html 使用Dagger 2依赖注入 - 图表创 ...
- 【Android】 图片编辑:创建圆角图片
创建圆角图片的方式大同小异,最简单的就是 9.png 美工做出来的就是.这种最省事直接设置就可以. 另外一种就是通过裁剪 这里的剪裁指的是依据原图我们自己生成一张新的bitmap,这个时候指定图片的目 ...
- unit vs2017基于nunit framework创建单元测试
unit vs2017基于nunit framework创建单元测试 一.简叙: 单元测试大型项目中是必备的,所以不可忽视,一个项目的成败就看是否有单元测试,对后期的扩展维护都带来了便利. 二.安装 ...
- 基于PIL模块创建验证码图片
def get_valid_img(request): # 方式2:基于PIL模块创建验证码图片 from PIL import Image, ImageDraw, ImageFont from io ...
- Android布局的一些属性和开关、创建log图片
文本的一些属性 android:id="@+id/editText" 给文本的id重命名 android:layout_width="wrap_content" ...
随机推荐
- [Django] Setting up Django Development Environment in Ubuntu 14.04
1. Python Of course you will need Python. Still Python 2.7 is preferred, however if you would like t ...
- SNMP–Simple Network Management Protocol
I am planning to write an introduction and simple implementation of SNMP in software, when my work w ...
- linux bash中too many arguments问题的解决方法
今天在编写shell脚本时,在if条件后跟的是[ $pid ],执行脚本的时候报 然后我输入改为[[$pid]]后,再执行脚本,就成功了,代码如下: #!/bin/bash pid=`ps -ef|g ...
- Unity and C#: Game Loop (Awake, Start, Update)
Introduction The central component of any game, from a programming standpoint, is the game loop. It ...
- ant常用命令
1.ant -version
- Hibernate -- A unidirectional one-to-one association on a foreign key
at sometime we usually need to create two tables that one table relate another.Such as a husband onl ...
- PHP 计算每个月的最后一天
主要用到了 PHP 的 date() 函数和 mktime() 函数. date() 函数的 format 参数用到了选项 t,它表示某个月总共有多少天,数值范围为28-31. mktime() 函数 ...
- 基于ejbca构建独立ca系统
ejbca,是一个CA(Certificate Authority)系统软件,CA是数字证书认证中心的简称,主要功能是管理数字证书,包括证书的颁发.销毁.更新等,ejbca实现了CA规范,因此可以用来 ...
- ASP.NET 5 入门(1) - 建立和开发ASP.NET 5 项目
ASP.NET入门(1) - 建立和开发ASP.NET 5 项目 ASP.NET 5 理解和入门 使用自定义配置文件 建立项目 首先,目前只有VS 2015支持开发最新的ASP.NET 5 程序,所以 ...
- JavaScript函数编程-Ramdajs
在JavaScript语言世界,函数是第一等公民.JavaScript函数是继承自Function的对象,函数能作另一个函数的参数或者返回值使用,这便形成了我们常说的高阶函数(或称函数对象).这就构成 ...