#import <UIKit/UIKit.h>

@interface WQViewController : UIViewController

- (id)initWithFrame:(CGRect)frame;

@end

#import "WQViewController.h"

#import "WQCollectionViewController.h"

#import "WQCollectionViewCircleLayout.h"

@interface WQViewController ()

@end

@implementation WQViewController

- (id)initWithFrame:(CGRect)frame {

if (self == [super init]) {

self.view.frame = frame;

self.view.backgroundColor = [UIColor yellowColor];

}

return self;

}

- (void)viewDidLoad {

[super viewDidLoad];

WQCollectionViewCircleLayout *circleLayout = [[WQCollectionViewCircleLayout alloc] init];

WQCollectionViewController *collectionVC = [[WQCollectionViewController alloc] initWithCollectionViewLayout:circleLayout];

[self addChildViewController:collectionVC];

[self.view addSubview:collectionVC.collectionView];

}

- (void)didReceiveMemoryWarning {

[super didReceiveMemoryWarning];

// Dispose of any resources that can be recreated.

}

@end

~~~~~~~~~~~~~~~~~~~~~~~

#import <UIKit/UIKit.h>

@interface WQCollectionViewController : UICollectionViewController

@end

#import "WQCollectionViewController.h"

#import "WQCollectionViewCircleLayout.h"

#import "WQCollectionViewCell.h"

@interface WQCollectionViewController ()

@property (assign, nonatomic) NSInteger     cellCount;

@end

@implementation WQCollectionViewController

static NSString * const reuseIdentifier = @"Cell";

- (void)viewDidLoad {

[super viewDidLoad];

_cellCount = 8;

self.collectionView.frame = [UIScreen mainScreen].bounds;

self.collectionView.backgroundColor = [UIColor whiteColor];

[self.collectionView registerClass:[WQCollectionViewCell class] forCellWithReuseIdentifier:reuseIdentifier];

UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTapGesture:)];

[self.collectionView addGestureRecognizer:tapGesture];

}

#pragma mark - UITapGesture

- (void)handleTapGesture:(UITapGestureRecognizer *)sender {

if (sender.state == UIGestureRecognizerStateEnded) {

CGPoint initiailPinchPoint = [sender locationInView:self.collectionView];

NSIndexPath *tapCellPath = [self.collectionView indexPathForItemAtPoint:initiailPinchPoint];

if (tapCellPath != nil) {

[self.collectionView performBatchUpdates:^{

self.cellCount = self.cellCount - 1;

[self.collectionView deleteItemsAtIndexPaths:[NSArray arrayWithObject:tapCellPath]];

} completion:^(BOOL finished) {

[self.collectionView reloadData];

}];

} else {

[self.collectionView performBatchUpdates:^{

self.cellCount = self.cellCount + 1;

[self.collectionView insertItemsAtIndexPaths:[NSArray arrayWithObject:[NSIndexPath indexPathForItem:(random()%self.cellCount) inSection:0]]];

} completion:^(BOOL finished) {

[self.collectionView reloadData];

}];

}

}

}

#pragma mark <UICollectionViewDataSource>

- (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView {

return 1;

}

- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section {

return _cellCount;

}

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

WQCollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:reuseIdentifier forIndexPath:indexPath];

[cell updateAppreanceAccrodingToItem:indexPath.item];

cell.contentView.backgroundColor = [UIColor redColor];

cell.contentView.layer.cornerRadius = 20;

cell.contentView.layer.masksToBounds = YES;

//    UILabel *lbl = [[UILabel alloc] init];

//    lbl.center = cell.contentView.center;

//    lbl.text = [NSString stringWithFormat:@"%ld", indexPath.item];

//    [lbl sizeToFit];

//    [cell.contentView addSubview:lbl];

//

return cell;

}

#pragma mark <UICollectionViewDelegate>

/*

// Uncomment this method to specify if the specified item should be highlighted during tracking

- (BOOL)collectionView:(UICollectionView *)collectionView shouldHighlightItemAtIndexPath:(NSIndexPath *)indexPath {

return YES;

}

*/

/*

// Uncomment this method to specify if the specified item should be selected

- (BOOL)collectionView:(UICollectionView *)collectionView shouldSelectItemAtIndexPath:(NSIndexPath *)indexPath {

return YES;

}

*/

/*

// Uncomment these methods to specify if an action menu should be displayed for the specified item, and react to actions performed on the item

- (BOOL)collectionView:(UICollectionView *)collectionView shouldShowMenuForItemAtIndexPath:(NSIndexPath *)indexPath {

return NO;

}

- (BOOL)collectionView:(UICollectionView *)collectionView canPerformAction:(SEL)action forItemAtIndexPath:(NSIndexPath *)indexPath withSender:(id)sender {

return NO;

}

- (void)collectionView:(UICollectionView *)collectionView performAction:(SEL)action forItemAtIndexPath:(NSIndexPath *)indexPath withSender:(id)sender {

}

*/

@end

~~~~~~~~~~~~~~~~~~~~~~~~

#import <UIKit/UIKit.h>

@interface WQCollectionViewCell : UICollectionViewCell

- (void)updateAppreanceAccrodingToItem:(NSInteger)item;

@end

#import "WQCollectionViewCell.h"

@interface WQCollectionViewCell ()

@property(strong, nonatomic)UILabel               *lbl;

@end

@implementation WQCollectionViewCell

-(void)prepareForReuse {

_lbl.text = nil;

}

- (void)updateAppreanceAccrodingToItem:(NSInteger)item {

self.lbl.text = [NSString stringWithFormat:@"%ld", item];

[self addSubview:self.lbl];

}

- (UILabel *)lbl {

if (_lbl == nil) {

_lbl = [[UILabel alloc] init];

[_lbl setFont:[UIFont systemFontOfSize:12.0f]];

_lbl.textAlignment = NSTextAlignmentCenter;

_lbl.frame = CGRectMake(10, 10, 20, 20);

}

return _lbl;

}

@end

~~~~~~~~~~~~~~~~~~~~~自定义layout

#import <UIKit/UIKit.h>

@interface WQCollectionViewCircleLayout : UICollectionViewLayout

@end

#define ITEM_SIZE           40.0f

#import "WQCollectionViewCircleLayout.h"

@interface WQCollectionViewCircleLayout ()

@property(assign, nonatomic) NSInteger           cellCount;

@property(assign, nonatomic) CGPoint             center;

@property(assign, nonatomic) CGFloat             radius;

@property(strong, nonatomic) NSMutableArray      *indexPathToAnimation;

@end

@implementation WQCollectionViewCircleLayout

- (void)prepareLayout {

[super prepareLayout];

CGSize size = self.collectionView.frame.size;

_cellCount = [self.collectionView numberOfItemsInSection:0];

_center = CGPointMake(size.width/2.0f, size.height/2.0f);

//    _radius = MIN(size.width/2.5f, size.height/2.5f);

_radius = 120;

}

- (CGSize)collectionViewContentSize {

return self.collectionView.frame.size;

}

- (NSArray<UICollectionViewLayoutAttributes *> *)layoutAttributesForElementsInRect:(CGRect)rect {

NSMutableArray *attributes = [NSMutableArray array];

for (int i = 0; i < _cellCount; i ++) {

NSIndexPath *indexPath = [NSIndexPath indexPathForItem:i inSection:0];

[attributes addObject:[self layoutAttributesForItemAtIndexPath:indexPath]];

}

return attributes;

}

-(BOOL)shouldInvalidateLayoutForBoundsChange:(CGRect)newBounds {

CGRect oldBounds = self.collectionView.bounds;

if (CGRectGetWidth(newBounds) != CGRectGetWidth(oldBounds) || CGRectGetHeight(newBounds) != CGRectGetWidth(oldBounds)) {

return YES;

}

return NO;

}

- (UICollectionViewLayoutAttributes *)layoutAttributesForItemAtIndexPath:(NSIndexPath *)indexPath {

UICollectionViewLayoutAttributes *layoutAttributes = [UICollectionViewLayoutAttributes layoutAttributesForCellWithIndexPath:indexPath];

layoutAttributes.size = CGSizeMake(ITEM_SIZE, ITEM_SIZE);

layoutAttributes.center = CGPointMake(_center.x + _radius * cosf(2*indexPath.item*M_PI / _cellCount), _center.y + _radius * sinf(2*indexPath.item*M_PI / _cellCount));

NSLog(@"%@", NSStringFromCGRect(layoutAttributes.frame));

return layoutAttributes;

}

-(void)prepareForCollectionViewUpdates:(NSArray<UICollectionViewUpdateItem *> *)updateItems {

[super prepareForCollectionViewUpdates:updateItems];

NSMutableArray *attrsArray = [NSMutableArray array];

for (UICollectionViewUpdateItem *updateItem in updateItems) {

switch (updateItem.updateAction) {

case UICollectionUpdateActionInsert:

{

NSIndexPath *itemIndex = updateItem.indexPathAfterUpdate;

[attrsArray addObject:itemIndex];

}

break;

case UICollectionUpdateActionDelete:

{

NSIndexPath *itemIndex = updateItem.indexPathBeforeUpdate;

[attrsArray addObject:itemIndex];

}

break;

case UICollectionUpdateActionMove:

{

NSIndexPath *itemIndexBeforeUpdate = updateItem.indexPathBeforeUpdate;

NSIndexPath *itemIndexAfterUpdate = updateItem.indexPathAfterUpdate;

[attrsArray addObject:itemIndexBeforeUpdate];

[attrsArray addObject:itemIndexAfterUpdate];

}

break;

case UICollectionUpdateActionReload:

break;

case UICollectionUpdateActionNone:

break;

default:

break;

}

}

_indexPathToAnimation = attrsArray;

}

-(UICollectionViewLayoutAttributes *)initialLayoutAttributesForAppearingItemAtIndexPath:(NSIndexPath *)itemIndexPath {

UICollectionViewLayoutAttributes *layoutAttr = [self layoutAttributesForItemAtIndexPath:itemIndexPath];

if ([_indexPathToAnimation containsObject:itemIndexPath]) {

layoutAttr.transform = CGAffineTransformRotate(CGAffineTransformMakeScale(0.2, 0.2), M_PI);

layoutAttr.center = CGPointMake(self.collectionView.center.x, self.collectionView.bounds.size.height);

//        layoutAttr.center = CGPointMake(CGRectGetMidX(self.collectionView.bounds), CGRectGetMidY(self.collectionView.bounds));

[self.indexPathToAnimation removeObject:itemIndexPath];

}

return layoutAttr;

}

@end

~~~~~~~~~~~~~实现效果:

UICollectionView之自定义Layout的更多相关文章

  1. UICollectionView Layout自定义 Layout布局

    from:   http://www.tuicool.com/articles/vuyIriN 当我们使用系统自带的UICollectionViewFlowLayout无法实现我们的布局时,我们就可以 ...

  2. 自定义 Layout布局 UICollectionViewLayout

    from:   http://www.tuicool.com/articles/vuyIriN 当我们使用系统自带的UICollectionViewFlowLayout无法实现我们的布局时,我们就可以 ...

  3. 一个UICollectionView自定义layout的实现

      #import <UIKit/UIKit.h> @interface AppDelegate : UIResponder <UIApplicationDelegate> @ ...

  4. UICollectionView的水平流水布局自定义layout

    最近做合创共美的商城项目,遇到发货地址的不配送地区,是做一个弹出框,弹出框的布局是根据地名字数长短不齐的标签. 本来也可以用tableview来做的.只不过多建几个tableviewcell就可以了. ...

  5. log4net 自定义Layout日志字段

    最近在使用log4net的时候有一个简单的需求,就是自定义个格式化输出符.这个输出符是专门用来帮我记录下业务ID.业务类型的.比如,“businessID:328593,businessType: o ...

  6. UICollectionview实现自定义cell的移动删除

    今天 ,有群里人询问了 ,支付宝首页的UICollectionview 的cell(其实不能成为cell,应该是item,不过大家习惯这么称呼了)怎么实现 自定义的拖拽 和删除,然后我查了下资料,它的 ...

  7. 使用纯代码定义UICollectionView和自定义UICollectionViewCell

    1.自定义UICollectionView 2.实现<UICollectionViewDataSource,UICollectionViewDelegateFlowLayout,UICollec ...

  8. 详细分享UICollectionView的自定义布局(瀑布流, 线性, 圆形…)

    前言: 本篇文章不是分享collectionView的详细使用教程, 而是属于比较’高级’的collectionView使用技巧, 阅读之前, 我想你已经很熟悉collectionView的基本使用, ...

  9. 安卓自定义控件(四)实现自定义Layout

    本来我是不准备写这篇文章的,我实在想不出有什么样奇怪的理由,会去继承ViewGroup然后自定义一个布局,大概是我的项目经验还不够吧,想了好久,想到了这样一个需求: 需求 如图:在项目中经常有一个这样 ...

随机推荐

  1. oracle 解析json格式

    1. CREATE OR REPLACE PACKAGE PKG_ANALYSE_COMMON IS -- AUTHOR : YZCHEN -- CREATED : 2013/11/26 14:12: ...

  2. centsOS下安装vsftp的配置

    1. 添加用户组 # groupadd www 2. 修改配置 # vi /etc/vsftpd/vsftpd.conf 查找: #chroot_list_enable=YES #chroot_lis ...

  3. javascript 延时执行函数

    延时执行函数,貌似有些多此一举, 也许还是有点用 记在这儿 var test = { delay : function(lifetime){ var data; setTimeout(function ...

  4. jQuery第四章

    jQuery中的事件和动画 一.jQuery中的事件 1.加载DOM (1)执行时机 $(document).ready()方法和window.onload方法有相似的功能,但是在执行时机方面是有区别 ...

  5. java 操作redis

    使用Java操作Redis需要jedis-2.1.0.jar,如果需要使用Redis连接池的话,还需commons-pool-1.5.4.jar package com.test; import ja ...

  6. Java的I/O总结

    概念:Java语言中数据流是接收和发送数据的管道.流是一位单项的. 流的分类: 按照字节字符:InputStream和OutputStream是字节输入输出流的抽象父类.Reader和Writer是字 ...

  7. LeetCode OJ 162. Find Peak Element

    A peak element is an element that is greater than its neighbors. Given an input array where num[i] ≠ ...

  8. mybatis的insert返回主键

    <insert id="insert" useGeneratedKeys="true" keyProperty="id" parame ...

  9. Smarty自定义函数

    自定义函数:<{方法名称}> 在html页面是可以直接赋值的:(没啥作用只是知道即可) <{$a = "hello"}><div><{$a ...

  10. The server instance Witness rejected configure request; read its error log file for more information. The reason 1427, and state 31, can be of use for

    数据库服务器做了镜像之后,发现有错误信息 The server instance Witness rejected configure request; read its error log file ...