北京iOS开发教程iOS自定义多选相册简单实现.doc_第1页
北京iOS开发教程iOS自定义多选相册简单实现.doc_第2页
北京iOS开发教程iOS自定义多选相册简单实现.doc_第3页
北京iOS开发教程iOS自定义多选相册简单实现.doc_第4页
北京iOS开发教程iOS自定义多选相册简单实现.doc_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

北京iOS开发教程iOS自定义多选相册简单实现在实际开发中,程序猿经常需要实现从手机本地相册一次性获取多张图片的需求,例如社交软件中发布状态时,从本地相册选取多张图片发布。提到从手机本地获取图片,首先想到的是iOS系统提供的UIImagePickerController控件。UIImagePickerController以模态视图的形式将本地相册中的照片显示出来,封装度高,实现简单,但是很难满足实际多样性的相册功能需求。本文将针对如何实现一个iOS自定义多选相册给出一些参考,希望能对iOS初学者有所帮助。查阅网上的现有资料,笔者发现功能的实现还是比较容易的。但是对于很多iOS初学者来说,成熟的第三方库最大的问题是代码封装度比较高,缺少一些适当的注释,难以理解和自行修改,另外,一些第三方的代码过于陈旧,MRC的内存管理机制对于现在的很多初学者都非常陌生。一下,我们以代码片段展示的形式来对功能的实现做分解。1、如果获取到手机本地的所有相册?1)需要的支持框架:#import在实现显示手机本地的所有相册的控制器中,导入该系统框架。该框架主要支持本地相册的读取以及相册图片的读取。2)需要的类:ALAssetsLibrary在控制器中声明一个ALAssetsLibrary类的属性,该属性专用于获取手机本地所有的相册资源。3)使用UITableView控件示相册,一个cell展示一个相册,点击cell跳转到下一界面展示相册内的图片。注意,需要将选中的ALAssetsGroup对象(一个对象代表了一个相册)传入下一个界面。主要代码如下:获取本地相册资源:#pragma mark - 获取本地相册- (void)getDataSource/1.数据源数据初始化if(!_dataSource)_dataSource = NSMutableArrayarray; /2.图片访问类对象初始化if (!_assetsLibrary) _assetsLibrary = ALAssetsLibraryallocinit; /3.相册获取dispatch_async(dispatch_get_main_queue(), _assetsLibraryenumerateGroupsWithTypes:ALAssetsGroupAllusingBlock:(ALAssetsGroup *group, BOOL *stop) /如果获取的相册不为空if (group) /添加数据 self.dataSourceaddObject:group;/主线程刷新UIselfperformSelectorOnMainThread:selector(reloadTableView) withObject:nilwaitUntilDone:YES; failureBlock:(NSError *error) NSLog(Group not found!n);/提示错误 ; )将相册展示在cell上:#pragma mark - cell的展示- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPathstaticNSString *cellID = AlbumGroupCell;UITableViewCell *cell = tableView dequeueReusableCellWithIdentifier:cellID;if (!cell) cell = UITableViewCellallocinitWithStyle:UITableViewCellStyleDefaultreuseIdentifier:cellID; /获取相册图片数ALAssetsGroup *group = (ALAssetsGroup*)self.dataSourceobjectAtIndex:indexPath.row; group setAssetsFilter:ALAssetsFilterallPhotos;NSInteger groupCount = group numberOfAssets;/相册来源NSString *groupName = group valueForProperty:ALAssetsGroupPropertyName;if (groupName isEqualToString:Camera Roll) groupName = 相机胶卷; elseif (groupName isEqualToString:My Photo Stream) groupName = 我的照片流; cell.textLabel.text = NSStringstringWithFormat:% (%ld),groupName, groupCount;/显示图片张数 cell.imageViewsetImage:UIImageimageWithCGImage:(ALAssetsGroup*)self.dataSourceobjectAtIndex:indexPath.row posterImage;/显示第一张图片 cell setAccessoryType:UITableViewCellAccessoryDisclosureIndicator;/显示cell右侧小箭头return cell;实现的效果如下:1.如何获取到相册中的所有图片?1) 需要的支持框架:#import2)需要的类:ALAssetsLibrary、ALAssetsGroup在控制器中声明一个ALAssetsLibrary类的属性,该属性专用于获取手机本地所有的相册资源。声明一个ALAssetsGroup类的属性,用于接收上个界面选中的相册资源。3)自定义一个数据模型类用于ALAsset对象(一个对象代表一张图片)以及图片状态的封装。4)使用UICollectionView控件展示相册所有图片。主要代码如下:获取相册中的所有图片:#pragma mark - 加载相册图片- (void)loadDataif (!_dataSource) _dataSource = NSMutableArrayarray; if(!_selectedAssetsGroup)_selectedAssetsGroup = NSMutableArrayarray; _assetsGroupenumerateAssetsUsingBlock:(ALAsset *result, NSUInteger index, BOOL *stop) if (result) ELNALAsset *asset = ELNALAssetallocinit;asset.asset = result;asset.isSelected = NO;_dataSourceaddObject:asset; ; _collectionViewreloadData;数据模型类的封装:#import #import interface ELNALAsset : NSObjectproperty (nonatomic,strong)ALAsset *asset;property (nonatomic,assign)BOOL isSelected;end实现效果如下:1.如何实现图片的多选功能?该功能的实现需要注意的地方有两点:1) 需要设置UICollectionView可多选:_collectionView.allowsMultipleSelection = YES;/设置支持复选1.同一个cell第一次点击选中,第二次点击取消选中,非常值得注意的是,在cell的选中状态发生改变时,要同步修改数据源中数据模型的相关属性,避免cell的复用时发生错乱,另外,修改数据的代码应该是在collectionView选中和替选方法中触发,而不是在自定义cell中setSelected方法触发。(选中与非选中状态是通过cell上是否显示选中的对勾图片区分的)#pragma mark - collectionView delegate/选中- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath/调用方法修改cell的选中状态 selfchangeCellWithIndexPath:indexPath;/替选- (void)collectionView:(UICollectionView *)collectionView didDeselectItemAtIndexPath:(NSIndexPath *)indexPath/调用方法修改cell的选中状态 selfchangeCellWithIndexPath:indexPath;#pragma mark - 修改cell的状态- (void)changeCellWithIndexPath:(NSIndexPath *)indexPath/1.通过indexPath获取到数据源中的模型对象,修改对象中修改状态ELNALAsset *asset = _dataSourceindexPath.row; asset.isSelected = 1; _dataSourcereplaceObjectAtIndex:indexPath.rowwithObject:asset;/2.将数据模型添加或者移除/如果选中将数据模型加入选中的数组if (asset.isSelected) self.selectedAssetsGroupaddObject:asset;else/如果取消选中将数据模型从选中数组中移除 self.selectedAsse

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论