文中相关知识点较多,只记载重点思路,相关部分都有对应注释说明,部分还需要优化,只是工作学习的一种思路。

@import AVFoundation;

@import Photos;   导入框架

- (void)viewDidLoad {

[super viewDidLoad];

[self getallAblumInfo];得到相应相册的所有资源

}

- (void)getallAblumInfo{

_localDic = [NSMutableDictionary dictionary];表示对应日期的相应资源集合的键值对

_allKeys = [NSMutableArray array];所有键的集合(目的是字典不会排序,需要通过键值获取对应时间升序的value数组)

PHFetchOptions *options = [[PHFetchOptions alloc]init];

options.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"creationDate" ascending:YES]];通过创建日期升序遍历

PHFetchResult  *userCollections = [PHCollection fetchTopLevelUserCollectionsWithOptions:nil];获取用户创建的相册集合

for (PHCollection *c in userCollections) {

if ([c.localizedTitle isEqualToString:@"Test"]) { 条件:集合元数据的相册名为Test

PHAssetCollection *collection = (PHAssetCollection *)c;

PHFetchResult *results = [PHAsset fetchAssetsInAssetCollection:collection options:options];在test相册中通过options条件得到phasset资源集合

NSMutableArray *arr = [NSMutableArray array];

for (int i = 0; i < results.count; i++) {

按时间排序分组

PHAsset *asset1 = results[i];

NSString *str1 = [NSDateFormatter localizedStringFromDate:asset1.creationDate

dateStyle:NSDateFormatterMediumStyle

timeStyle:NSDateFormatterNoStyle];得到资源的年月日

if (i == 0) {

[_allKeys addObject:str1];

[arr addObject:asset1];

[_localDic setObject:arr forKey:str1];

}

if (i > 0) {

PHAsset *asset0 = results[i-1];

NSString *str0 = [NSDateFormatter localizedStringFromDate:asset0.creationDate

dateStyle:NSDateFormatterMediumStyle

timeStyle:NSDateFormatterNoStyle];

if ([str0 isEqualToString:str1]) {

[arr addObject:asset1];

[_localDic setObject:arr forKey:str1];添加元数据到字典

}else{

[_allKeys addObject:str1];

arr = [NSMutableArray array];

[arr addObject:asset1];

[_localDic setObject:arr forKey:str1];

}

}

}

}

}

}

条件2: uicollectionviewdatasource

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath{

LocalCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:LocalID forIndexPath:indexPath];

PHImageManager *manager = [PHImageManager defaultManager];

if (cell.tag) {

NSLog(@"tag = %ld",cell.tag);

[manager cancelImageRequest:(PHImageRequestID)cell.tag];

}

PHAsset *asset = [_localDic objectForKey:_allKeys[indexPath.section]][indexPath.row];

if (asset.mediaType == PHAssetMediaTypeImage) {资源为图片类型

PHImageRequestOptions *options = [[PHImageRequestOptions alloc]init];

options.resizeMode = PHImageRequestOptionsResizeModeFast;

options.deliveryMode = PHImageRequestOptionsDeliveryModeFastFormat;

options.synchronous = YES;

cell.tag = [manager requestImageForAsset:asset targetSize:CGSizeMake(300, 300) contentMode:PHImageContentModeAspectFit options:options resultHandler:^(UIImage *result, NSDictionary *info) {

cell.contentImg.image = result;获取缩略图

}];

}else if(asset.mediaType == PHAssetMediaTypeVideo){资源为视频类型

cell.tag = [manager requestAVAssetForVideo:asset options:nil resultHandler:^(AVAsset *asset1, AVAudioMix *audioMix, NSDictionary *info) {

AVAssetImageGenerator *generator = [[AVAssetImageGenerator alloc]initWithAsset:asset1];

generator.appliesPreferredTrackTransform = YES;将图片设置为正图

CMTime time = CMTimeMake(0.6, 30);当前时刻的图片

AVAssetImageGeneratorCompletionHandler handler = ^(CMTime requestedTime, CGImageRef image, CMTime actualTime, AVAssetImageGeneratorResult result, NSError *error){

UIImage *thumbImg = [UIImage imageWithCGImage:image];

if (result == AVAssetImageGeneratorSucceeded) {

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{

UIGraphicsBeginImageContextWithOptions(cell.contentImg.image.size, NO, 0.0);主线程中合并图片,主要是给缩略图加上一个播放按钮图区分

[thumbImg drawInRect:CGRectMake(0, 0, cell.contentImg.image.size.width, cell.contentImg.image.size.height)];

[[UIImage imageNamed:@"Play"] drawInRect:CGRectMake(cell.contentImg.image.size.width/2-cell.contentImg.image.size.width/6, cell.contentImg.image.size.height/2-cell.contentImg.image.size.height/6, cell.contentImg.image.size.width/3, cell.contentImg.image.size.height/3)];

UIImage *fullImage = UIGraphicsGetImageFromCurrentImageContext();

UIGraphicsEndImageContext();

cell.contentImg.image = fullImage;

});

}

};

generator.maximumSize = CGSizeMake(200, 200);

[generator generateCGImagesAsynchronouslyForTimes:

[NSArray arrayWithObject:[NSValue valueWithCMTime:time]] completionHandler:handler];

}];

}

return cell;

}

- (UICollectionReusableView *)collectionView:(UICollectionView *)collectionView viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath{

HeaderCollectionView *reusable = [collectionView dequeueReusableSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:@"headerView" forIndexPath:indexPath];

reusable.lab.text = _allKeys[indexPath.section];设置头视图的日期

NSLog(@"text : %@",reusable.lab.text);

return reusable;

}

UICollectionViewLayoutDelegate     设置头视图的高度(垂直滚动)

- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout referenceSizeForHeaderInSection:(NSInteger)section{

return CGSizeMake(self.view.bounds.size.width, 44);

}

iOS之Photos:访问某个相册通过collectionView显示的更多相关文章

  1. mui 访问系统相册将图片显示到网页

    访问系统相返回值为一个对象,通过转换为字符串可以查看,path.files[0]为返回路径去除路径赋值到src 调用摄像头返回的相片的path为一个路径通过 plus.io.resolveLocalF ...

  2. [iOS 开发] app无法访问本地相册,且不显示在设置 -隐私 - 照片中

    近几天在使用iOS8的Photos Framework访问本地相册时,app即不会弹出是否允许访问提示框,也无法显示在iPhone的设置-隐私-照片的访问列表中,代码如下: PHAuthorizati ...

  3. IOS编程之相机和相册

    概述 IOS设备中的相机和相册,是我们在项目开发中经常会使用到的多媒体元素,使用相机可以获得最新想要的照片,而使用相册则可以访问IOS设备中的图片资源 使用IOS设备中的相机/相册获得图片资源 是否允 ...

  4. Android相机、相册获取图片显示并保存到SD卡

    Android相机.相册获取图片显示并保存到SD卡 [复制链接]   电梯直达 楼主    发表于 2013-3-13 19:51:43 | 只看该作者 |只看大图  本帖最后由 happy小妖同学 ...

  5. C# 之 读取Word时发生 “拒绝访问” 及 “消息筛选器显示应用程序正在使用中” 异常的处理

    1.Asp.net中建立Microsoft.Office.Interop.Word.Application时出现 “ 拒绝访问 ” 错误 项目中要实现在服务器端打开一个Word模版文件,修改其内容后再 ...

  6. 杂记-格式化Date默认格式,日期加一天,jstl判断字符类型,ajax模拟from表单后台跳转页面,jstl访问数据库并在页面显示

    1.格式化Date默认格式 String str="Sun Oct 08 22:36:45 CST 2017"; SimpleDateFormat sdf = new Simple ...

  7. Delphi for iOS开发指南(8):在iOS应用程序中使用Tab组件来显示分页

    Delphi for iOS开发指南(8):在iOS应用程序中使用Tab组件来显示分页 在FireMonkey iOS应用程序中的Tab Tab由FMX.TabControl.TTabControl定 ...

  8. 李洪强iOS开发之-实现点击单行View显示和隐藏Cell

    李洪强iOS开发之-实现点击单行View显示和隐藏Cell 实现的效果:  .... ....

  9. python统计apache、nginx访问日志IP访问次数并且排序(显示前20条)【转】

    前言:python统计apache.nginx访问日志IP访问次数并且排序(显示前20条).其实用awk+sort等命令可以实现,用awk数组也可以实现,这里只是用python尝试下.   apach ...

随机推荐

  1. ACM题目————反约瑟夫问题

    题目描述 Description 著名的约瑟夫问题是这样描述的:N个人排成一个圆圈,然后把这N个人按逆时针方向编号为1.2.….N:随机产生 一个正整数M,然后从编号为1的人开始按逆时针计数,当某人计 ...

  2. EffectiveJava笔记(第一部分)

    考虑用静态构造方法代替构造器的好处: 1.静态构造方法有名字     BigInteger.probablePrime(int, int, Random)比 new BigInteger(int, i ...

  3. 浪首登录浮层增加收藏入口项目学到的几点知识-IE7 bug、relatedTarget、字符串换行

    这两天做这个项目略有收获,记录如下: 1. 项目中有个bug,在IE7中登录成功时下拉菜单没有展开的情况下总有个残影在页面中,如下图所示: 通过多种方法都没有解决,后来才知道原来是在IE中displa ...

  4. Tomcat优化总结

    一.内存溢出问题 Linux设置启动脚本 [root@LAMP ~]# vi /usr/local/tomcat/bin/catalina.sh #__________________________ ...

  5. Apache Commons-pool实现对象池(包括带key对象池)

    Commons-pool是一个apache开源组织下的众多项目的一个.其被广泛地整合到众多需要对象池功能的项目中. 官网:http://commons.apache.org/proper/common ...

  6. PHP比较运算!=和!==

    PHP!=和!==的区别 !==是指绝对不等于,比如,$a = 3, $b="3" 那么,$a!==$b成立,可是$a!=$b不成立:

  7. php获取 本月 本周 或者 下月 下周的 开始时间 结束时间

    <?php $now_time = time(); $date=date("Y-m-d",$now_time); function get_date($date,$t='d' ...

  8. xcode下载地址

    本帖最后由 tsingjun 于 12/9/20 04:46 PM 编辑 Xcode 4.4.1正式版下载地址 http://kuai.xunlei.com/d/UXZFTWONQLUD XCode ...

  9. Struts2的处理结果(二)——处理结果的类型

    Struts2的处理结果(二) --处理结果的类型 1.Struts2內建的支持的结果类型: 在<result>元素中的type属性,确定了结果类型. chain:Action链式处理的结 ...

  10. ruby学习总结03

    1.方法的调用 对象.方法名(参数1,参数2,...)     可以省略参数列表的() 对象.方法名(参数1,...) do |变量1,变量2,...|            可以省略参数的() 块内 ...