#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. javaWEB总结(10):HttpServlet成长史

    前言: 从Servlet,ServletConfig到GenericServlet再到Httpservlet的整个过程,相当于Httpservlet的成长史,我们不需要写那么臃肿的代码,开发难度由复杂 ...

  2. js---DOM元素节点

    创建新的 HTML 元素如需向 HTML DOM 添加新元素,您必须首先创建该元素(元素节点),然后向一个已存在的元素追加该元素. 实例1: <!DOCTYPE html> <htm ...

  3. iOS开发Embedded dylibs/frameworks are only supported on iOS 8.0 and later for architecture armv7的解决方法

    全局搜索IPHONEOS_DEPLOYMENT_TARGE改为更小的版本

  4. Token验证失败的解决方法

    Token验证失败 微信 微信公众平台开发 Token校验失败 URL Token原文 http://www.cnblogs.com/txw1958/p/token-verify.html Token ...

  5. HDU 2509 Be the Winner(取火柴博弈2)

    传送门 #include<iostream> #include<cstdio> #include<cstring> using namespace std; int ...

  6. Introducing 'bind'

    原文地址:http://fsharpforfunandprofit.com/posts/computation-expressions-bind/ 上一篇讨论了如何理解let作为一个能实现contin ...

  7. Gym 100553B Burrito King 无脑背包

    题意就是你有n和m两个上限 吃一个东西会同时增加两个东西 m的值不能超过给定的m 问最后的n m值和每个东西吃了多少 贪心一下就好了 算一下性价比 从最大的开始吃 直到吃满了m n也一定是最大了 只是 ...

  8. digitalocean完成B轮8300万美元融资,赠送10美元优惠码

    7月8日,美国vps服务商digitalocean在官方博客宣传,公司完成高达8300万美元B轮融资.融资方包括 IA Ventures, Andreessen Horowitz和Access Ind ...

  9. 可以有效防护XSS,sql注射,代码执行,文件包含等多种高危漏洞。

    http://bbs.aliyun.com/read/137391.html <?php /** * 云体检通用漏洞防护补丁v1.1 * 更新时间:2013-05-25 * 功能说明:防护XSS ...

  10. Quartz(任务调度)- 入门学习

    参照:http://blog.csdn.net/szwangdf/article/details/6158646 1.自定义定时任务管理类 QuartzManager 参照大神基础上新增:1.添加jo ...