从Samples中入门IOS开发(六)------ Photo和Album浏览
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浏览相关推荐
- swiftUI系列-我的个人side project开始,19年入门iOS开发
swiftUI系列-我的个人side project开始,19年入门iOS开发 我为什么要搞side project 打工是挣钱的最佳途径,但是只是存粹的上班挣钱来说,一是难以获得成就感(毕竟面试造火 ...
- 【VMware中搭建iOS开发环境的引导工具】
最近临时接手iOS开发,在VMware 9.0中搭建了Xcode + iPhone SDK开发环境,本来打算下笔一记,但这个环境的搭建教程网上一抓一大把,bill就不再赘述了.但是bill在引导工具的 ...
- 汉诺塔自动解题动画中的iOS开发技巧
引 前段时间做了一道题,要求实现汉诺塔游戏的自动解题动画: 汉诺塔游戏应该都了解规则: 1.将盘子全部移动到塔C 2.每次只能移动一个圆盘: 3.大盘不能叠在小盘上面. 要求由用户输入盘子的数量,绘制 ...
- ios开发text kit_IOS开发入门之TextKit详解
本文将带你了解IOS开发入门iOS 开发 富文本详解之TextKit详解,希望本文对大家学IOS有所帮助. textkit结构 textkit使用步骤 #Mark - 1. 自定义label --c ...
- android 地球坐标 火星坐标系,IOS开发入门之iOS开发火星坐标系与地球坐标系解析...
本文将带你了解IOS开发入门iOS开发火星坐标系与地球坐标系解析,希望本文对大家学IOS有所帮助. iOS开发火星坐标系与地球坐标系解析. 在开发过程中,遇到一个问题,安卓和iOS传同样的经纬度给后台 ...
- iOS开发之窥探UICollectionViewController(四) --一款功能强大的自定义瀑布流
在上一篇博客中<iOS开发之窥探UICollectionViewController(三) --使用UICollectionView自定义瀑布流>,自定义瀑布流的列数,Cell的外边距,C ...
- (0096)iOS开发之应用间的分享系列(1)
分享系列: (1)应用间的分享概要 (2) Share Extension将应用添加到系统分享列表 (3) 在自己的应用中调起系统分享面板分享到面板上的其他应用中 (0097)iOS开发之应用间的分享 ...
- iOS开发的就业形势怎么样?
以下是 100offer 整理的关于 iOS 开发就业形势的报告,看完就你知道做 iOS 开发多有"钱"途了. 在创业约等于做APP的互联网市场,几乎每一家互联网公司都需要 iOS ...
- IOS开发百度地图API入门到精通-用点生成路线,导航,气泡响应
(转)IOS开发百度地图API入门到精通-用点生成路线,导航,气泡响应 IOS百度地图API开发自定义气泡,点击气泡自动生成路线,以及拖拽 IOS百度地图开发POISearch搜索附近停车场,附近加油 ...
最新文章
- rawquery 没扎到返回什么_当mysql_query返回false时
- 第三章 python数据规整化
- python游戏程序中游戏对象是什么_练习项目21:使用python制作游戏(下)
- 5.9 QR分解--Gram-Schmidt 分解
- css块元素与行内元素特点,CSS区分块级元素和行内元素
- java ssm 系统的搭建_SSM框架下的javaweb学生管理系统--搭建系统结构
- 7-177 输出全排列 (20 分)
- python第五章课后作业_python 入门到实践第五章课后练习
- Json学习总结(5)——阿里巴巴开源库 Fastjson详解
- iOS-状态栏字体颜色【白色】【Xcode9.1】
- 《设计模式详解》设计模式概述、UML
- GTK+图形化应用程序开发学习笔记(六)—按钮
- selenium webdriver显示等待时间
- learning ddr DLL-off mode
- 股票数据下载-下载股票历史数据
- 21岁雅虎卖身引发一波怀旧 市值曾高达1250亿美元
- 【Struck】论文阅读笔记
- 未来教育计算机二级2020年9月有几套题,未来教育】2021年9月全国计算机二级office题库国二计算机等级考试上机考试真题计算机二级msoffice2021年考试备考三月教材九2016...
- 刚开始投资黄金理财,怎么扩大自己的小金库
- -moz、-ms、-webkit浏览器私有前缀详解,作用、出处