本文主要实现:

(1)用UICollectionView显示一组图片

(2)左右滑动来浏览所有图片

(3)图片自动对齐到网格(即滑动停止后中间的图片对齐到正中位置)

(4)中间图片始终放大显示。

效果如下图:

(1)先实现UICollectionView显示一组图片,方法看我的上一篇关于UICollection基本使用方法的Blog:UICollectionView的基本使用(1)

(2)使用UICollectionViewLayout来管理UICollectionView的视图。方法为新建一个继承UICollectionViewFlowLayout的类,这里命名为LineLayout。

LineLayout.m完整代码为:

#import "LineLayout.h"@implementation LineLayout
-(id)init{self = [super init];if (self) {self.scrollDirection = UICollectionViewScrollDirectionHorizontal;//设置为水平显示self.minimumLineSpacing = 30.0;//cell的最小间隔}return self;
}-(CGPoint)targetContentOffsetForProposedContentOffset:(CGPoint)proposedContentOffset withScrollingVelocity:(CGPoint)velocity{//proposedContentOffset是没有设置对齐时本应该停下的位置(collectionView落在屏幕左上角的点坐标)CGFloat offsetAdjustment = MAXFLOAT;//初始化调整距离为无限大CGFloat horizontalCenter = proposedContentOffset.x + (CGRectGetWidth(self.collectionView.bounds) / 2.0);//collectionView落在屏幕中点的x坐标CGRect targetRect = CGRectMake(proposedContentOffset.x, 0.0, self.collectionView.bounds.size.width, self.collectionView.bounds.size.height);//collectionView落在屏幕的大小NSArray* array = [super layoutAttributesForElementsInRect:targetRect];//获得落在屏幕的所有cell的属性//对当前屏幕中的UICollectionViewLayoutAttributes逐个与屏幕中心进行比较,找出最接近中心的一个for (UICollectionViewLayoutAttributes* layoutAttributes in array) {CGFloat itemHorizontalCenter = layoutAttributes.center.x;if (ABS(itemHorizontalCenter - horizontalCenter) < ABS(offsetAdjustment)) {offsetAdjustment = itemHorizontalCenter - horizontalCenter;}}//调整return CGPointMake(proposedContentOffset.x + offsetAdjustment, proposedContentOffset.y);
}/** 有效距离:当item的中间x距离屏幕的中间x在HMActiveDistance以内,才会开始放大, 其它情况都是缩小 */
static CGFloat const ActiveDistance = 60;
/** 缩放因素: 值越大, item就会越大 */
static CGFloat const ScaleFactor = 0.2;
-(NSArray *)layoutAttributesForElementsInRect:(CGRect)rect
{NSArray *array = [super layoutAttributesForElementsInRect:rect];CGRect visibleRect;visibleRect.origin = self.collectionView.contentOffset;visibleRect.size = self.collectionView.bounds.size;//遍历所有布局属性for (UICollectionViewLayoutAttributes* attributes in array) {//如果cell在屏幕上则进行缩放if (CGRectIntersectsRect(attributes.frame, rect)) {CGFloat distance = CGRectGetMidX(visibleRect) - attributes.center.x;//距离中点的距离CGFloat normalizedDistance = distance / ActiveDistance;if (ABS(distance) < ActiveDistance) {CGFloat zoom = 1 + ScaleFactor*(1 - ABS(normalizedDistance));attributes.transform3D = CATransform3DMakeScale(zoom, zoom, 1.0);attributes.zIndex = 1;}}}return array;
}/***  只要显示的边界发生改变就重新布局:内部会重新调用prepareLayout和layoutAttributesForElementsInRect方法获得所有cell的布局属性*/
- (BOOL)shouldInvalidateLayoutForBoundsChange:(CGRect)newBounds
{return YES;
}@end

(3)将步骤(2)中的LineLayout实例赋值给UICollectionView的collectionViewLayout.
ViewController.m完整代码(只是在上一篇吧blog中的viewDidLoad方法中加了两行代码):

#import "ViewController.h"
#import "ACollectionViewCell.h"
#import "LineLayout.h"
int const cellCount = 40;
@interface ViewController ()
@property(nonatomic,strong)NSArray *imgArr;
@end@implementation ViewController- (void)viewDidLoad {[super viewDidLoad];LineLayout *layout = [[LineLayout alloc]init];self.collectionView.collectionViewLayout = layout;
}//图片懒加载
-(NSArray*)imgArr{if (!_imgArr) {NSMutableArray *muArr = [NSMutableArray array];for (int i = 0; i < cellCount; i++) {UIImage *image = [UIImage imageNamed:[NSString stringWithFormat:@"%d",i]];[muArr addObject:image];}_imgArr = muArr;}return _imgArr;
}#pragma mark - UICollectionViewDataSource Delegate
#pragma mark cell的数量
-(NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section
{return cellCount;
}#pragma mark cell的视图
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{NSString *cellIdentifier = @"CollectionViewCell";ACollectionViewCell *collectionViewCell = [collectionView dequeueReusableCellWithReuseIdentifier:cellIdentifier forIndexPath:indexPath];collectionViewCell.layer.cornerRadius = 6.0f;collectionViewCell.image.image = [self.imgArr objectAtIndex:indexPath.row];collectionViewCell.title.text = [[NSString alloc] initWithFormat:@"图片%d",indexPath.row];return collectionViewCell;
}#pragma mark cell的大小
-(CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath{return CGSizeMake(120, 140);
}#pragma mark cell的点击事件
- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath
{NSLog(@"点击图片%d",indexPath.row);
}@end

(4)运行测试,效果如下图:

本demo代码下载:http://download.csdn.net/detail/dolacmeng/8678473

(2)iOS用UICollectionView实现Gallery效果相关推荐

  1. iOS流布局UICollectionView系列七——三维中的球型布局

    iOS流布局UICollectionView系列七--三维中的球型布局 发布时间: 2015/10/29 13:25 阅读: 1487 收藏: 23 点赞: 1 评论: 5 摘要 类似标签云的球状布局 ...

  2. 【WWDC2016 Session笔记】 iOS 10 UICollectionView新特性

    本文转载自:点击打开链接 前言 关于 iOS 10 UICollectionView的新特性,主要还是体现在如下3个方面 顺滑的滑动体验 现在基本上人人都离不开手机,手机的app也每天都有人在用.一个 ...

  3. iOS 10 UICollectionView 性能优化

    前言 关于 iOS 10 UICollectionView的新特性,主要还是体现在如下3个方面 顺滑的滑动体验 现在基本上人人都离不开手机,手机的app也每天都有人在用.一个app的好坏由它的用户体验 ...

  4. iOS 之 UICollectionView

    1. iOS 之 UICollectionView 之 原理介绍 2. iOS 之 UICollectionView 之 开发步骤 之 OC 3. iOS 之 UICollectionView 之 开 ...

  5. Android之RecyclerView 实现真正的Gallery效果

    简介: RecyclerView是support-v7包中的新组件,是一个强大的滑动组件,与经典的ListView相比,同样拥有item回收复用的功能,但是直接把viewholder的实现封装起来,用 ...

  6. Android 使用ViewPager实现画廊Gallery效果

    2019独角兽企业重金招聘Python工程师标准>>> 在手机QQ上切换封面主题板块,以及在某些App Shop中,我们经常看见Gallery效果的影子,但Gallery以及被一起了 ...

  7. android 仿ios动画效果代码,Android仿IOS上拉下拉弹性效果的实例代码

    用过iphone的朋友相信都体验过页面上拉下拉有一个弹性的效果,使用起来用户体验很好:Android并没有给我们封装这样一个效果,我们来看下在Android里如何实现这个效果.先看效果,感觉有些时候还 ...

  8. 微信小程序在ios中下拉出现“橡皮筋”效果

    今天和大家聊一聊微信小程序在ios中下拉出现"橡皮筋"效果 问题现象 话不多说,先看代码(使用taro编写). 代码很简单,一个flex的容器+一个允许进行下拉刷新的ScrollV ...

  9. 用RecyclerView做一个小清新的Gallery效果

    一.简介 RecyclerView现在已经是越来越强大,且不说已经被大家用到滚瓜烂熟的代替ListView的基础功能,现在RecyclerView还可以取代ViewPager实现Banner效果,当然 ...

最新文章

  1. python爬虫(四)_urllib2:handle处理器和自定义opener
  2. 大数据市场规模5年将达8000亿 交易平台忙圈地
  3. linux 7 nano,Linux初學(CnetOS Linux7)之文本編輯器nano以及關機
  4. 去年全球勒索软件攻击收入达10亿美元
  5. jmeter JDBC 连接数据库
  6. macbook视频格式转换_如何将Mac视频格式转换
  7. 教你用快捷键 以管理员身份运行cmd
  8. 软件测试常问面试题,你真的会搭建测试环境吗?
  9. 数据生产力崛起:新动能 新治理 - 摘要
  10. python求组合数c(m、n)编程题_c语言编程问题,计算出从n 个不同元素中取出m 个元素(m≤n)的组合数。编写程序...
  11. RTP协议解析及H264/H265 音视频RTP打包分析
  12. 中招报名网站服务器错误,中考报名显示密码错误 中考网上报名说我密码错误怎么办...
  13. HTML/CSS中的空格处理
  14. 1小时学会HTML5基础
  15. 转发--2022新型冠状病毒肺炎诊疗方案(试行第九版)-中医治疗部分
  16. NRF24L01(1)
  17. (项目)在线教育平台(九)
  18. 物理学的困惑: 科学的道德规范和伦理观
  19. BAPC 2019 G. Gluttonous Goop 线段树扫描线
  20. python制作软件界面_使用Python制作一个带GUI界面的词云自动生成工具(一)

热门文章

  1. 在CentOS 7中安装与配置Tomcat-8方法
  2. HDU 1711 Number Sequence(KMP算法)
  3. python的沙盒环境virtualenv(二)--简单使用
  4. sdut 2401 最大矩形面积
  5. 解决firefox ubuntu无法打开页面的问题
  6. 鸡肋的PHP单例模式
  7. ulimit -SHn 65535 含义
  8. C语言memset函数详解(Linux下和windows下的差异)
  9. 在C#中使用COM+实现事务控制
  10. String.Format()方法