ViewController.m

 //
// ViewController.m
// IOS_0226_自定义UIColectionView布局
//
// Created by ma c on 16/2/26.
// Copyright © 2016年 博文科技. All rights reserved.
// #import "ViewController.h"
#import "ImgCell.h"
#import "LineLayout.h"
#import "FoldLayout.h"
#import "CircleLayout.h" @interface ViewController ()<UICollectionViewDataSource,UICollectionViewDelegate> @property (nonatomic, strong) NSMutableArray *imgsArray;
@property (nonatomic, weak) UICollectionView *collectionView; @end @implementation ViewController static NSString *ID = @"image"; - (NSMutableArray *)imgsArray
{
if (!_imgsArray) {
_imgsArray = [NSMutableArray array]; for (int i=; i<; i++) {
[_imgsArray addObject:[NSString stringWithFormat:@"%d.jpg",i]]; }
}
return _imgsArray;
} - (void)viewDidLoad {
[super viewDidLoad];
[self createUI];
} - (void)createUI
{
CGRect rect = CGRectMake(, , , );
UICollectionView *collection = [[UICollectionView alloc] initWithFrame:rect collectionViewLayout:[[FoldLayout alloc] init]];
collection.dataSource = self;
collection.delegate = self;
// [collection registerClass:[UICollectionViewCell class] forCellWithReuseIdentifier:ID];
[collection registerNib:[UINib nibWithNibName:@"ImgCell" bundle:nil] forCellWithReuseIdentifier:ID];
[self.view addSubview:collection];
self.collectionView = collection; } - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
if ([self.collectionView.collectionViewLayout isKindOfClass:[FoldLayout class]]) {
[self.collectionView setCollectionViewLayout:[[CircleLayout alloc] init] animated:YES];
}
else{
[self.collectionView setCollectionViewLayout:[[FoldLayout alloc] init] animated:YES];
}
} #pragma mark - UICollectionViewDataSource - (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section
{
return self.imgsArray.count;
} - (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
ImgCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:ID forIndexPath:indexPath]; cell.image = self.imgsArray[indexPath.item]; return cell;
} #pragma mark - UICollectionViewDelegate - (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath
{
//删除模型数据
[self.imgsArray removeObjectAtIndex:indexPath.item];
//刷新UI
[collectionView deleteItemsAtIndexPaths:@[indexPath]];
} @end
LineLayout.m(线性流水布局)
 //
// LineLayout.m
// IOS_0226_自定义UIColectionView布局
//
// Created by ma c on 16/2/26.
// Copyright © 2016年 博文科技. All rights reserved.
// #import "LineLayout.h" static const CGFloat lineLayoutSize = ; @implementation LineLayout //初始化
- (void)prepareLayout
{
[super prepareLayout];
//设置item大小
self.itemSize = CGSizeMake(lineLayoutSize, lineLayoutSize);
//设置两端居中
CGFloat inset = (self.collectionView.frame.size.width - lineLayoutSize) * 0.5;
self.sectionInset = UIEdgeInsetsMake(, inset, , inset); //设置水平滚动
self.scrollDirection = UICollectionViewScrollDirectionHorizontal;
//设置间距
self.minimumLineSpacing = lineLayoutSize; //每一个item都有自己的UICollectionViewLayoutAttributes
//每一indexPath都有自己的UICollectionViewLayoutAttributes
} //只要显示的边界发生变化就重新布局:内部会重新调用prepareLayout,layoutAttributesForElementsInRect方法获得所有item的布局属性
- (BOOL)shouldInvalidateLayoutForBoundsChange:(CGRect)newBounds
{
return YES;
} - (NSArray<UICollectionViewLayoutAttributes *> *)layoutAttributesForElementsInRect:(CGRect)rect
{
//NSLog(@"layoutAttributesForElementsInRect");
// 0.计算可见的矩形框
CGRect visibleRect;
visibleRect.size = self.collectionView.frame.size;
visibleRect.origin = self.collectionView.contentOffset;
// 1.获得默认的item的UICollectionViewLayoutAttributes
NSArray *array = [super layoutAttributesForElementsInRect:rect];
NSArray * attributes = [[NSArray alloc] initWithArray:array copyItems:YES]; // 2.计算屏幕最中间的x
CGFloat centerX = self.collectionView.contentOffset.x + self.collectionView.frame.size.width * 0.5; for (UICollectionViewLayoutAttributes *attr in attributes) { if (!CGRectIntersectsRect(visibleRect, attr.frame)) continue; // 每一个item中点x
CGFloat itemCenterX = attr.center.x;
//计算item离屏幕中间的距离
CGFloat distance = ABS(itemCenterX - centerX);
//距离越小,缩放比例越大
CGFloat zoom = - (distance / (self.collectionView.frame.size.width * 0.5));
//NSLog(@"%f",zoom);
//缩放比例
CGFloat scale = + 0.5 * zoom;
//缩放
attr.transform3D = CATransform3DMakeScale(scale, scale, );
} return attributes;
} //用来设置UICollectionView停止滚动那一刻的位置
- (CGPoint)targetContentOffsetForProposedContentOffset:(CGPoint)proposedContentOffset withScrollingVelocity:(CGPoint)velocity
{
// 1.计算UICollectionView最终停止的范围
CGRect lastRect;
lastRect.origin = proposedContentOffset;
lastRect.size = self.collectionView.frame.size;
// 计算屏幕中间的x
CGFloat centerX = proposedContentOffset.x + self.collectionView.frame.size.width * 0.5;
// 2.取出这个范围内的所有属性
NSArray *array = [super layoutAttributesForElementsInRect:lastRect];
NSArray * attributes = [[NSArray alloc] initWithArray:array copyItems:YES]; // 3.遍历所有属性
CGFloat adjustOffsetX = MAXFLOAT;
for (UICollectionViewLayoutAttributes *attr in attributes) {
if (ABS(attr.center.x - centerX) < ABS(adjustOffsetX)) {
adjustOffsetX = attr.center.x - centerX;
}
}
return CGPointMake(proposedContentOffset.x + adjustOffsetX, proposedContentOffset.y);
} @end

FoldLayout.m(折叠布局)

 //
// FoldLayout.m
// IOS_0226_自定义UIColectionView布局
//
// Created by ma c on 16/2/27.
// Copyright © 2016年 博文科技. All rights reserved.
// #import "FoldLayout.h" #define Random0_1 (arc4random_uniform(100)/100) @implementation FoldLayout - (BOOL)shouldInvalidateLayoutForBoundsChange:(CGRect)newBounds
{
return YES;
} - (CGSize)collectionViewContentSize
{
return CGSizeMake(, );
} - (UICollectionViewLayoutAttributes *)layoutAttributesForItemAtIndexPath:(NSIndexPath *)indexPath
{
NSArray *angles = @[@, @(-0.2), @(-0.5), @, @(0.2), @(0.5)]; UICollectionViewLayoutAttributes *attrs = [UICollectionViewLayoutAttributes layoutAttributesForCellWithIndexPath:indexPath];
attrs.size = CGSizeMake(, );
// attrs.center = CGPointMake(arc4random_uniform(self.collectionView.frame.size.width), arc4random_uniform(self.collectionView.frame.size.height));
attrs.center = CGPointMake(self.collectionView.frame.size.width * 0.5, self.collectionView.frame.size.height * 0.5);
if (indexPath.item >= ) {
attrs.hidden = YES;
} else {
attrs.transform = CGAffineTransformMakeRotation([angles[indexPath.item] floatValue]);
//zIndex越大,就越在上面
attrs.zIndex = [self.collectionView numberOfItemsInSection:indexPath.section] - indexPath.item;
}
return attrs;
} - (NSArray<UICollectionViewLayoutAttributes *> *)layoutAttributesForElementsInRect:(CGRect)rect
{
NSMutableArray *array = [NSMutableArray array];
NSInteger count = [self.collectionView numberOfItemsInSection:]; for (int i=; i<count; i++) {
// UICollectionViewLayoutAttributes *attrs = [UICollectionViewLayoutAttributes layoutAttributesForCellWithIndexPath:[NSIndexPath indexPathForItem:i inSection:0]];
// attrs.size = CGSizeMake(100, 100);
// attrs.center = CGPointMake(self.collectionView.frame.size.width * 0.5, self.collectionView.frame.size.height * 0.5);
// if (i >= 5) {
// attrs.hidden = YES;
// } else {
//
// NSArray *angles = @[@0, @(-0.2), @(-0.5), @(0.2), @(0.5)];
// attrs.transform = CGAffineTransformMakeRotation([angles[i] floatValue]);
// //zIndex越大,就越在上面
// attrs.zIndex = count - i;
NSIndexPath *indexPath = [NSIndexPath indexPathForItem:i inSection:];
UICollectionViewLayoutAttributes *attrs = [self layoutAttributesForItemAtIndexPath:indexPath];
[array addObject:attrs]; }
return array;
} @end
CircleLayout.m(环形布局)
 //
// CircleLayout.m
// IOS_0226_自定义UIColectionView布局
//
// Created by ma c on 16/2/27.
// Copyright © 2016年 博文科技. All rights reserved.
// #import "CircleLayout.h" @implementation CircleLayout - (BOOL)shouldInvalidateLayoutForBoundsChange:(CGRect)newBounds
{
return YES;
} - (UICollectionViewLayoutAttributes *)layoutAttributesForItemAtIndexPath:(NSIndexPath *)indexPath
{ UICollectionViewLayoutAttributes *attrs = [UICollectionViewLayoutAttributes layoutAttributesForCellWithIndexPath:indexPath];
attrs.size = CGSizeMake(, ); //圆的半径
CGFloat radius = ;
CGPoint cireclecenter = CGPointMake(self.collectionView.frame.size.width * 0.5, self.collectionView.frame.size.height * 0.5);
//每个item间角度
CGFloat angleDetla = M_PI * / [self.collectionView numberOfItemsInSection:indexPath.section]; //计算当前item角度
CGFloat angle = indexPath.item * angleDetla;
attrs.center = CGPointMake(cireclecenter.x + radius * cosf(angle), cireclecenter.y + radius * sinf(angle)); attrs.zIndex = indexPath.item;
return attrs;
} - (NSArray<UICollectionViewLayoutAttributes *> *)layoutAttributesForElementsInRect:(CGRect)rect
{
NSMutableArray *array = [NSMutableArray array];
NSInteger count = [self.collectionView numberOfItemsInSection:]; for (int i=; i<count; i++) {
NSIndexPath *indexPath = [NSIndexPath indexPathForItem:i inSection:];
UICollectionViewLayoutAttributes *attrs = [self layoutAttributesForItemAtIndexPath:indexPath];
[array addObject:attrs]; }
return array;
} @end
ImgCell.h(自定义UICollectionViewCell)
 //
// ImgCell.h
// IOS_0226_自定义UIColectionView布局
//
// Created by ma c on 16/2/26.
// Copyright © 2016年 博文科技. All rights reserved.
// #import <UIKit/UIKit.h> @interface ImgCell : UICollectionViewCell @property (weak, nonatomic) IBOutlet UIImageView *imgView;
@property (nonatomic, copy) NSString *image; @end //
// ImgCell.m
// IOS_0226_自定义UIColectionView布局
//
// Created by ma c on 16/2/26.
// Copyright © 2016年 博文科技. All rights reserved.
// #import "ImgCell.h" @interface ImgCell () @end @implementation ImgCell - (void)setImage:(NSString *)image
{
_image = [image copy];
self.imgView.image = [UIImage imageNamed:_image];
} - (void)awakeFromNib {
self.imgView.layer.borderWidth = ;
self.imgView.layer.borderColor = [UIColor whiteColor].CGColor;
self.imgView.layer.cornerRadius = ;
self.imgView.clipsToBounds = YES;
} @end

IOS UI-自定义UIColectionView布局的更多相关文章

  1. iOS开发自定义流水布局

    //集成UICollectionViewFlowLayout 自己写的布局 //  SJBFlowLayout.m //  自定义流水布局 // //  Created by zyyt on 16/7 ...

  2. Android开发1:基本UI界面设计——布局和组件

    前言 啦啦啦~本学期要开始学习Android开发啦~ 博主在开始学习前是完完全全的小白,只有在平时完成老师要求的实验的过程中一步一步学习~从此篇博文起,博主将开始发布Android开发有关的博文,希望 ...

  3. [前端]使用JQuery UI Layout Plug-in布局 - wolfy

    引言 使用JQuery UI Layout Plug-in布局框架实现快速布局,用起来还是挺方便的,稍微研究了一下,就能上手,关于该布局框架的材料,网上也挺多的.在项目中也使用到了,不过那是前端的工作 ...

  4. JQuery UI Layout Plug-in布局

    端]使用JQuery UI Layout Plug-in布局   引言 使用JQuery UI Layout Plug-in布局框架实现快速布局,用起来还是挺方便的,稍微研究了一下,就能上手,关于该布 ...

  5. 【详细】Android入门到放弃篇-YES OR NO-》各种UI组件,布局管理器,单元Activity

    问:达叔,你放弃了吗? 答:不,放弃是不可能的,丢了Android,你会心疼吗?如果别人把你丢掉,你是痛苦呢?还是痛苦呢?~ 引导语 有人说,爱上一个人是痛苦的,有人说,喜欢一个人是幸福的. 人与人之 ...

  6. [前端]使用JQuery UI Layout Plug-in布局

    引言 使用JQuery UI Layout Plug-in布局框架实现快速布局,用起来还是挺方便的,稍微研究了一下,就能上手,关于该布局框架的材料,网上也挺多的.在项目中也使用到了,不过那是前端的工作 ...

  7. iOS 如何自定义UISearchBar 中textField的高度

    iOS 如何自定义UISearchBar 中textField的高度 只需设置下边的方法就可以 [_searchBar setSearchFieldBackgroundImage:[UIImage i ...

  8. 原生HTML5 input type=file按钮UI自定义

    原生<input type="file" name="file" />长得太丑 提升一下颜值 实现方案一.设置input[type=file]透明度 ...

  9. iOS 隐藏自定义tabbar

    iOS  隐藏自定义tabbar -(void)viewWillAppear:(BOOL)animated { NSArray *array=self.tabBarController.view.su ...

随机推荐

  1. JQueryEasyUI easyui-combobox 单击文本区域显示下拉菜单

    //单击内容框弹出下拉菜单 $(".combo").click(function (e) { if (e.target.className == 'combo-text valid ...

  2. sqlite常用的命令-增删改查

    一.查看版本信息: #sqlite3 -version 二.sqlite3常用命令 1.当前目录下建立或打开test.db数据库文件,并进入sqlite命令终端,以sqlite>前缀标识: 2. ...

  3. js小工具---本地图片转换为base64编码数据

    今天用jmeter对图片对比进行性能测试,post请求为json请求,图片为Base64编码后的图片数据.所以需要将一张本地图片生成base64编码,找到一个js小工具,记录在这儿便于以后复用. 效果 ...

  4. oracle 分区表详解

    一.分区表的概述: Oracle的表分区功能通过改善可管理性.性能和可用性,从而为各式应用程序带来了极大的好处.通常,分区可以使某些查询以及维护操作的性能大大提高.此外,分区还可以极大简化常见的管理任 ...

  5. 前端工程师在实现支付功能的时候能做些什么(V客学院技术分享)?

    现在最流行的两种支付微信支付和支付宝支付,在日常开发的过程中肯定离不开支付功能的开发,有很多人第一次接触时会有些措手不及. 一.业务逻辑 (电商平台为例子) 支付大部分用在电商平台,各种打赏,游戏充值 ...

  6. Linux CentOS6环境下MySQL5.1升级至MySQL5.5版本过程

    转载地址:http://www.laozuo.org/6145.html 老左今天有在帮朋友的博客搬迁到另外一台VPS主机环境,其环境采用的是LLSMP架构的,原先的服务器采用的是LNMP网站环境,其 ...

  7. Activiti工作流引擎数据库表结构

    Activiti工作流引擎数据库表结构 一.数据库表的命名 Acitiviti数据库中表的命名都是以ACT_开头的.第二部分是一个两个字符用例表的标识.此用例大体与服务API是匹配的. ACT_RE_ ...

  8. ASP.NET MVC 必备开发环境

    许多初学者为了搭建开发环境,很多软件找不齐,或者找不到的比较新而且稳定版本.所以我将下载和安装的资料整理了下,供大家下载.资料均收集于网络,但基本核实资料的可靠性,但不能完全保证.如果你在使用过程中发 ...

  9. dd命令参数解析

    seek=N : 跳过N个输出块 skip=N : 跳过N个输入块 注意:sd卡的每个扇区的大小统一为512个字节

  10. [BZOJ2599]Race

    Description 给一棵树,每条边有权.求一条简单路径,权值和等于K,且边的数量最小.N <= 200000, K <= 1000000 Input 第一行 两个整数 n, k 第二 ...