前言

经过几天的断断续续的编写终于把这一个小项目完成了,现在刚刚完成,代码看着不整洁,请多包涵。
前几天要弄个相册多选和照相选图的功能,以前做过单选上传头像之类的。但是多选确实不像那么简单,github找了好多的例子,都是在用几个框架。不是说人家封的不好,封的很好,但是卤煮比较笨,看了好久还是马马虎虎。然后上网查了下资料,还是决定自己写一个。

demo传送门在此,哈哈哈

正文

多选主要是需要一个frameworks:AssetsLibrary。这个类的主要功能就是多选(个人理解,不对请见谅)。
首先,我们从相册开始:
要查看所有的相册,简单的思路大家应该都有:获取相册组---获取相册,但是怎么进行呢,AssetsLibrary的用处来了。

- (void)countOfAlbumGroup:(void(^)(ALAssetsGroup *yfGroup))block{//计算有几个相册[self enumerateGroupsWithTypes:ALAssetsGroupAll usingBlock:^(ALAssetsGroup *group, BOOL *stop) {if (group) {[group setAssetsFilter:[ALAssetsFilter allPhotos]];if (block) {block(group);}}} failureBlock:^(NSError *error) {NSLog(@"获取相册错误,%@",error);}];}

这个是计算相册数,可能手机相册会有好几个,所以要查看一下有几个,毕竟用户有很大的可能只会选择某一个相册里面的某一张相片。我是把这个方法拿了出来专门创建了一个类,这样代码思路会清晰一些。
既然我们知道有几个相册了,每个相册的一些信息也知道了,那么我们应该去显示某一个相册里面的所有照片了呀。这一步的代码来了:

/***  获得一个相册有多少照片**/
- (void)callAllPhoto:(ALAssetsGroup *)group result:(void(^)(YFSelfImage *image))block{//获得所有的图片资源[group enumerateAssetsUsingBlock:^(ALAsset *result, NSUInteger index, BOOL *stop) {if (result) {YFSelfImage *image = [[YFSelfImage alloc]initWithCGImage:[result thumbnail]];image.asset = result;block(image);}}];
}

这个方法的一个参数group,就是上一个代码段得到的相册group,拿到group之后就去求里面所有的照片。这里涉及到两个点我说一下:

YFSelfImage

这是一个我自己稍微封装了uiimage的一个类

/***  用于储存相册图片,附有一个asset信息,用于图片的其他处理**/
#import <UIKit/UIKit.h>
#import <AssetsLibrary/AssetsLibrary.h>
@interface YFSelfImage : UIImage
//可能需要的图片信息
@property(nonatomic,strong)ALAsset *asset;
@end

比普通的UIImage多了一个属性,asset。这一个就是要说的第二个点。

ALAsset

这一个类应该是多选里面最关联的一个类了,它有照片的信息关联,比如缩略图之类的都可以通过它获取。所以,我们多选全靠它去做事情。(关于用法和属性,请google吧,网上有很多很多)。
好了,现在相册里面的照片也获取了,我要把它都显示出来了,哎呀呀呀呀,龟派气功波~~~~~~

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath{YFShowAlbumCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:SHOWCELL forIndexPath:indexPath];YFSelfImage *image = [_dataArray objectAtIndex:indexPath.row];cell.imageView.image = image;return cell;
}

然后我们可以查看效果了:
相册组:

相册:

好了,基本的显示完成了,大家也看到了,我上面有个完成按钮。那么我们是不是需要在照片那来个选择按钮,然后我们得到选择的图片是吧,不然只是实现查看相册有什么卵用。
再次编辑collectionview:

 YFShowAlbumCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:SHOWCELL forIndexPath:indexPath];cell.selectBtn.tag = cellIndex;//按钮选中块__weak typeof(self)weakSelf = self;cell.selectedBlock = ^(NSInteger index){//把选中的图片放倒一个数组里面[weakSelf.selectedArray addObject:[weakSelf.dataArray objectAtIndex:index]];selectBtn.userInteractionEnabled = YES;};//取消选定cell.cancelBlock = ^(NSInteger index){//找出取消的cellYFSelfImage *oldImage = [weakSelf.dataArray objectAtIndex:index];//从选中的数组去除for (YFSelfImage *newImage in weakSelf.selectedArray) {if (newImage == oldImage) {//移除[weakSelf.selectedArray removeObject:newImage];//判断完成按钮是否可以使用if(weakSelf.selectedArray.count <= 0){selectBtn.userInteractionEnabled = NO;}return ;}}};
YFSelfImage *image = [_dataArray objectAtIndex:cellIndex];cell.imageView.image = image;return cell;
}

再来看一下效果:

好了,现在我们是可以选择了,现在我们要实现的是把我们选择的照片拿到放到一个数组里面保存使用。前段代码大家应该看见了,照片按钮的选中与取选操作都谢了,我们现在完成“完成”这个按钮操作了:

/***  完成选定*/
- (void)successChoose{//把选择的图片传送过去NSDictionary *dic = @{@"cellImage":self.selectedArray};[[NSNotificationCenter defaultCenter]postNotificationName:@"pushImage" object:nil userInfo:dic];//退出模态[self dismissViewControllerAnimated:YES completion:^{//这一步确保退出到显示界面的时候显示相册组控制器一定退出[self.navigationController popViewControllerAnimated:YES];}];
}

这个有个解释点:
就是数退出模态后又做了一次导航pop。因为这个项目的界面布局是:

所以,我从单相册显示界面dismiss相当于直接回到开始界面,但是你在下一次在进入相册组界面的时候会出问题,它会直接进入单相册显示界面,也就是说在你dismiss之后后者两个界面貌似没有释放的样子,还是记住了相册组界面push到单相册界面的状态。所以我在此处做了一个pop,防止出现这个问题。
在完成按钮时,我已经选择了通过通知把数组带回了开始界面。所以开始界面会有我们所选择的照片的显示。

这里说一下,这个删除事件我就不讲了,大家一看应该都懂的。略过~~~~~~
好了,现在开始相机选择照片这一块:
首先我们打开一下相册,固定死代码:

/***  打开相机*/
- (void)showCamera{//选择相机UIImagePickerControllerSourceType sourceType = UIImagePickerControllerSourceTypeCamera;UIImagePickerController *picker = [[UIImagePickerController alloc] init];//初始化picker.delegate = self;// picker.allowsEditing = YES;//设置可编辑picker.sourceType = sourceType;//进入照相界面[[self getCurrentVC] presentViewController:picker animated:YES completion:nil];
}

然后嘞,嘎嘎,照了照片之后,我们选择这张照片,那么学问来了,我们选择这张照片可以直接去

- (void)imagePickerController:(UIImagePickerController *)picker
didFinishPickingMediaWithInfo:(NSDictionary *)info{}

这个代理里面去做操作,当然为了和相册多选照片的属性一致,我们需要做点操作。首先思路应该是把照的照片先放到相册,然后我们去相册去拿到这个相册最后一张图片,就是这个相机照的图片。
多说无益,上代码:

- (void)imagePickerController:(UIImagePickerController *)picker
didFinishPickingMediaWithInfo:(NSDictionary *)info{//    //图片UIImage *image;//判断是不是从相机过来的if (picker.sourceType != UIImagePickerControllerSourceTypePhotoLibrary) {//关闭相机[picker dismissViewControllerAnimated:YES completion:nil];image = [info objectForKey:UIImagePickerControllerOriginalImage];}//通过判断picker的sourceType,如果是拍照则保存到相册去.非常重要的一步,不然,无法获取照相的图片if (picker.sourceType == UIImagePickerControllerSourceTypeCamera) {UIImageWriteToSavedPhotosAlbum(image, self, @selector(image:didFinishSavingWithError:contextInfo:), nil);}
}
/***  确定相机图片保存到系统相册后,进行图片获取*/
- (void)image:(UIImage *)image didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo {NSLog(@"已保存");//操作获得的照片,我这是直接显示,你那个你加到你显示的一组里面去显示去就好了ALAssetsLibrary *library = [[ALAssetsLibrary alloc]init];//操作获得的照片,我这是直接显示,你那个你加到你显示的一组里面去显示去就好了[library afterCameraAsset:^(ALAsset *asset) {YFSelfImage *image = [[YFSelfImage alloc]initWithCGImage:asset.thumbnail];image.asset = asset;//传递NSDictionary *dic = @{@"saveImage":image};[[NSNotificationCenter defaultCenter]postNotificationName:@"SAVEIMAGE" object:nil userInfo:dic];}];}

好了,现在我们获到了相机图片。
然后我还是选择发送一个通知把照片传给显示页。

结语

好了,好了,不行了,不写了。应该也差不多了。还有一些小的功能没有写,一切都在代码里面。

iOS 相册多选 相机选择图片相关推荐

  1. android调取手机相册或打开相机选择图片并显示

    作为一个android小白,自己想尝试写一个小项目,因此写个小博客记录一下自己的开发历程.这一篇记录自己学习调取手机相册以及打开相机选择图片并显示 示例是采用PopupWindow弹出底部菜单,选择相 ...

  2. Swift使用UIImagePickerController 从相册选择图片、从相机选择图片

    配置: 如果是相机使用,需要在info.plist文件增加使用前应用程序说明:相机使用也是如此.(第二个是CALENDARS权限,打错了:图片是Photo Library Usage Descript ...

  3. 【Xamarin】MonoTouch - iOS 使用 UIImagePickerController 打开图片库和相机选择图片修改头像...

    Application tried to present modally an active controller <UIImagePickerController: 0x7b6ff400> ...

  4. android 仿微信选取相册_Android模仿微信选择图片

    前言 最近公司需要做一个类似微信那种选择头像和上传图片的功能,本想上github上找的,后来想了想,还是自己做一个,不仅方便以后用(毕竟自己写的修改起来也比较方便),还可以学到一些知识,废话少说,先看 ...

  5. 微信小程序调用相机选择图片生成水印

    项目近期有一个需求,是在小程序使用相机拍照时,页面缩略图和上传服务器(或保存本地)的都是带水印的,水印文案是当前的时间和当前所处的地点. 前期使用了微信小程序的wx.chooseImage相机拍照,再 ...

  6. 实现炫酷的获取本地图片和相机拍照图片-自定义组件

    IOS中有封装好的选择图片后长按出现动画删除效果,效果如下 而Android找了很久都没有找到有这样效果的第三方组件,最后懒得找了还是自己实现这效果吧 选择图片后还可对图片进行剪裁 当然,代码中还有很 ...

  7. 微信小程序:从本地相册选择图片、相机拍照,并将所选图片上传到服务器

    简介 小程序项目中有个需求:用户聊天时可以上传图片,还能支持拍照.于是学习了一下,分享给大家. 微信小程序中有个wx.chooseImage的方法可以快捷调用达到需求的效果. 具体实现 1.为了简化代 ...

  8. Flutter 相册选择图片和相机拍照

    Flutter 获取相册中的图片和用相机拍照   在原生开发中,拍照及从图库选择图片是非常常见的需求,而且原生的图片选择第三方库也有很多并且很完善了.Flutter 也给我们提供了好用的图片选择插件, ...

  9. 【iOS】拍照/相册单选、相册多选、图片浏览、图片裁剪

    有一段时间没有写iOS系列的博客了.最近由于项目的需要,就有封装了一个拍照/相册单选.相册多选.图片浏览.图片裁剪的工具类.在封装这这类是站在巨人的肩膀上做的. 1.ZLPhotoBrowser:ht ...

  10. iOS从相册选择图片并裁剪,可用于上传头像

    iOS从相册选择图片并裁剪 前言 笔者最近接了一个任务,是从手机相册选择图片并裁剪后上传.于是在裁剪的这一块,我用了VPImageCropper.从相册获取图片,我一开始看的是TZImagePicke ...

最新文章

  1. word2vec (一) 简介与训练过程概要
  2. Linux Shell学习(3)
  3. Nginx 多站点配置
  4. axivion和astree_Axivion架构分析及验证工具
  5. cocos2dx 3.0打包android遇到的错误(持续更新)
  6. BZOJ3437:小P的牧场(斜率优化DP)
  7. 轻薄 linux 笔记本,华为MateBook13Linux版全面屏轻薄性能笔记本一键重装win10图文
  8. 手机号邮箱怎么注册?邮箱登陆163登录入口
  9. java netbeans_Java初学者学习Netbeans介绍
  10. Riverbed连续第四年成为Gartner魔力象限领导者
  11. 100047. 【NOIP2017提高A组模拟7.14】基因变异
  12. 四则运算之Right-BICEP单元测试
  13. 保你学会Springboot如何前后端分离地传输数据!(后端,前端的坑过几天填上)
  14. 1186: 零起点学算法93——改革春风吹满地(C)
  15. 笃静守一,深耕匠设:2018“渲云杯”全国空间表现大赛颁奖盛典
  16. Lesson 18 He often does this! 他经常干这种事!
  17. 无法正常打开网页的解决方法(情况一)
  18. dreamweaver网页设计作业制作 小米商城官网商城购物网页设计 WEB静态网页作业模板 大学生个人购物商城网页代码 dw个人网页作业
  19. Presto (二) --------- Presto 安装
  20. Angular4_管道转换大小写

热门文章

  1. 重组人骨形态发生蛋白-2(BMP 2)的研究意义
  2. 决定了,儿童节我们用python画这个...
  3. 微信小程序--自定义按钮样式(1)
  4. 高校大数据专业教学实训资源解决方案
  5. 三星android怎么解锁屏幕旋转,三星S10如何设置打开应用自动旋转屏幕
  6. 李大狗:从 Logo, Basic 到区块链 - Mixin Network 开发者访谈系列 第二期
  7. 惊讶!一行Python代码让图形秒变「手绘风」
  8. 留给10年后的自己观看,T4-7生活就像那条小巷!
  9. 第一次结对编程作业——需求分析与原型设计
  10. Origin如何绘出带有时间轴的趋势图