MyImagePicker展示了如何调用系统Photo和Album,并在自定义的UI中进行浏览,而这个也是很大众化的需求。

先看看这个例子的使用流程:

对于这个Sample,我主要关注两个关键点:

  • 调用系统Photo和Album
  • UI组件的嵌套和组合

调用系统Photo和Album

IOS提供了类ALAssetsLibrary来取得Photo下面的资源(photo, album, video等),它的主要调用方式是遍历和block回调:

NSUInteger groupTypes = ALAssetsGroupAlbum | ALAssetsGroupEvent | ALAssetsGroupFaces;
[assetsLibrary enumerateGroupsWithTypes:groupTypes usingBlock:listGroupBlock failureBlock:failureBlock];

以上代码就是要遍历ALAssetsGroupAlbum | ALAssetsGroupEvent | ALAssetsGroupFaces这三种资源,并在遍历过程中回调listGroupBlock和failureBlock这两个block,下面看看这两个block的实现:

ALAssetsLibraryGroupsEnumerationResultsBlock listGroupBlock = ^(ALAssetsGroup *group, BOOL *stop) {if (group) {[groups addObject:group];} else {[self.tableView performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:NO];}
};ALAssetsLibraryAccessFailureBlock failureBlock = ^(NSError *error) {AssetsDataIsInaccessibleViewController *assetsDataInaccessibleViewController = [[AssetsDataIsInaccessibleViewController alloc] initWithNibName:@"AssetsDataIsInaccessibleViewController" bundle:nil];NSString *errorMessage = nil;switch ([error code]) {case ALAssetsLibraryAccessUserDeniedError:case ALAssetsLibraryAccessGloballyDeniedError:errorMessage = @"The user has declined access to it.";break;default:errorMessage = @"Reason unknown.";break;}assetsDataInaccessibleViewController.explanation = errorMessage;[self presentModalViewController:assetsDataInaccessibleViewController animated:NO];[assetsDataInaccessibleViewController release];
};

逻辑很简单,就是在遍历过程中把资源放入groups数组并刷新tableview。

UI组件的嵌套和组合

本例子的UI由各种UI组件嵌套组合而成,而这也体现了IOS标准化和定制化有效结合。首先看看上图中间的page,此page是展示某个album下所有photos,每一行展示4个photo缩微图,点击某个缩微图能调转到下个page,本例子采用的是tableview嵌套自定义的tableViewCell,并在此cell里嵌套四个自定义的ImageView。代码如下所示:

// Customize the appearance of table view cells.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {static NSString *CellIdentifier = @"Cell";AlbumContentsTableViewCell *cell = (AlbumContentsTableViewCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];if (cell == nil) {[[NSBundle mainBundle] loadNibNamed:@"AlbumContentsTableViewCell" owner:self options:nil];cell = tmpCell;tmpCell = nil;}cell.rowNumber = indexPath.row;cell.selectionDelegate = self;// Configure the cell...NSUInteger firstPhotoInCell = indexPath.row * 4;NSUInteger lastPhotoInCell  = firstPhotoInCell + 4;if (assets.count <= firstPhotoInCell) {NSLog(@"We are out of range, asking to start with photo %d but we only have %d", firstPhotoInCell, assets.count);return nil;}NSUInteger currentPhotoIndex = 0;NSUInteger lastPhotoIndex = MIN(lastPhotoInCell, assets.count);for ( ; firstPhotoInCell + currentPhotoIndex < lastPhotoIndex ; currentPhotoIndex++) {ALAsset *asset = [assets objectAtIndex:firstPhotoInCell + currentPhotoIndex];CGImageRef thumbnailImageRef = [asset thumbnail];UIImage *thumbnail = [UIImage imageWithCGImage:thumbnailImageRef];switch (currentPhotoIndex) {case 0:[cell photo1].image = thumbnail;break;case 1:[cell photo2].image = thumbnail;break;case 2:[cell photo3].image = thumbnail;break;case 3:[cell photo4].image = thumbnail;break;default:break;}}return cell;
}

在上图最右边的那个page中,展示某个photo,最外层是个UIScollView,此view再嵌套一个自定义的imageView,在自定义的imageview中实现多点触控等功能。代码如下所示:

- (void)viewDidLoad {self.title = @"Photo";UIScrollView *imageScrollView = (UIScrollView *)self.view;[imageScrollView setBackgroundColor:[UIColor blackColor]];[imageScrollView setDelegate:self];[imageScrollView setBouncesZoom:YES];ALAssetRepresentation *assetRepresentation = [asset defaultRepresentation];UIImage *fullScreenImage = [UIImage imageWithCGImage:[assetRepresentation fullScreenImage] scale:[assetRepresentation scale] orientation:(UIImageOrientation)[assetRepresentation orientation]];// add touch-sensitive image view to the scroll viewTapDetectingImageView *imageView = [[TapDetectingImageView alloc] initWithImage:fullScreenImage];[imageView setDelegate:self];[imageView setTag:ZOOM_VIEW_TAG];[imageScrollView setContentSize:[imageView frame].size];[imageScrollView addSubview:imageView];[imageView release];// calculate minimum scale to perfectly fit image width, and begin at that scalefloat minimumScale = [imageScrollView frame].size.width  / [imageView frame].size.width;[imageScrollView setMinimumZoomScale:minimumScale];[imageScrollView zoomToRect:CGRectMake(0.0, 0.0, imageView.frame.size.width, imageView.frame.size.height) animated:NO];}

所以从这个例子中能学习到如何灵活地嵌套和组合多种UI组件,并把事件侦听delegate出来。

从Samples中入门IOS开发(六)------ Photo和Album浏览相关推荐

  1. swiftUI系列-我的个人side project开始,19年入门iOS开发

    swiftUI系列-我的个人side project开始,19年入门iOS开发 我为什么要搞side project 打工是挣钱的最佳途径,但是只是存粹的上班挣钱来说,一是难以获得成就感(毕竟面试造火 ...

  2. 【VMware中搭建iOS开发环境的引导工具】

    最近临时接手iOS开发,在VMware 9.0中搭建了Xcode + iPhone SDK开发环境,本来打算下笔一记,但这个环境的搭建教程网上一抓一大把,bill就不再赘述了.但是bill在引导工具的 ...

  3. 汉诺塔自动解题动画中的iOS开发技巧

    引 前段时间做了一道题,要求实现汉诺塔游戏的自动解题动画: 汉诺塔游戏应该都了解规则: 1.将盘子全部移动到塔C 2.每次只能移动一个圆盘: 3.大盘不能叠在小盘上面. 要求由用户输入盘子的数量,绘制 ...

  4. ios开发text kit_IOS开发入门之TextKit详解

    本文将带你了解IOS开发入门iOS 开发 富文本详解之TextKit详解,希望本文对大家学IOS有所帮助. textkit结构 textkit使用步骤 #Mark - 1. 自定义label  --c ...

  5. android 地球坐标 火星坐标系,IOS开发入门之iOS开发火星坐标系与地球坐标系解析...

    本文将带你了解IOS开发入门iOS开发火星坐标系与地球坐标系解析,希望本文对大家学IOS有所帮助. iOS开发火星坐标系与地球坐标系解析. 在开发过程中,遇到一个问题,安卓和iOS传同样的经纬度给后台 ...

  6. iOS开发之窥探UICollectionViewController(四) --一款功能强大的自定义瀑布流

    在上一篇博客中<iOS开发之窥探UICollectionViewController(三) --使用UICollectionView自定义瀑布流>,自定义瀑布流的列数,Cell的外边距,C ...

  7. (0096)iOS开发之应用间的分享系列(1)

    分享系列: (1)应用间的分享概要 (2) Share Extension将应用添加到系统分享列表 (3) 在自己的应用中调起系统分享面板分享到面板上的其他应用中 (0097)iOS开发之应用间的分享 ...

  8. iOS开发的就业形势怎么样?

    以下是 100offer 整理的关于 iOS 开发就业形势的报告,看完就你知道做 iOS 开发多有"钱"途了. 在创业约等于做APP的互联网市场,几乎每一家互联网公司都需要 iOS ...

  9. IOS开发百度地图API入门到精通-用点生成路线,导航,气泡响应

    (转)IOS开发百度地图API入门到精通-用点生成路线,导航,气泡响应 IOS百度地图API开发自定义气泡,点击气泡自动生成路线,以及拖拽 IOS百度地图开发POISearch搜索附近停车场,附近加油 ...

最新文章

  1. rawquery 没扎到返回什么_当mysql_query返回false时
  2. 第三章 python数据规整化
  3. python游戏程序中游戏对象是什么_练习项目21:使用python制作游戏(下)
  4. 5.9 QR分解--Gram-Schmidt 分解
  5. css块元素与行内元素特点,CSS区分块级元素和行内元素
  6. java ssm 系统的搭建_SSM框架下的javaweb学生管理系统--搭建系统结构
  7. 7-177 输出全排列 (20 分)
  8. python第五章课后作业_python 入门到实践第五章课后练习
  9. Json学习总结(5)——阿里巴巴开源库 Fastjson详解
  10. iOS-状态栏字体颜色【白色】【Xcode9.1】
  11. 《设计模式详解》设计模式概述、UML
  12. GTK+图形化应用程序开发学习笔记(六)—按钮
  13. selenium webdriver显示等待时间
  14. learning ddr DLL-off mode
  15. 股票数据下载-下载股票历史数据
  16. 21岁雅虎卖身引发一波怀旧 市值曾高达1250亿美元
  17. 【Struck】论文阅读笔记
  18. 未来教育计算机二级2020年9月有几套题,未来教育】2021年9月全国计算机二级office题库国二计算机等级考试上机考试真题计算机二级msoffice2021年考试备考三月教材九2016...
  19. 刚开始投资黄金理财,怎么扩大自己的小金库
  20. -moz、-ms、-webkit浏览器私有前缀详解,作用、出处

热门文章

  1. [BZOJ 1037] 生日聚会Party
  2. 任意方位矩形相交面积计算
  3. 一、K3 WISE 开发插件《K3 WISE常用数据表整理》
  4. linux目录跳到目录,linux目录跳转快捷方式——z武器
  5. Windows ❀ Win10如何打开注册表编辑器
  6. 疑难技术点汇总(一)---手机号正则匹配
  7. matlab仿真OLED出现的摩尔纹,一种针对OLED屏的高鲁棒性DeMURA方法与流程
  8. java checkstyle 导入_CheckStyle的安装和使用
  9. J9数字论:区块链上的智能合约是什么?
  10. 安卓自定义弹幕view,实现飞屏