Masonry-AutoLayout的率先次于使用体验。UICollectionView的惊人自适应。

以前自己就来几乎浅特别查阅了 AutoLayout
的相干材料,好吧其实就是有的牛牛在祥和之博客上之运教程以及部分心得。一直还惦记方试试一下但一直尚未呀时来执行,这首文章主要说之是我是如何用
Masonry 移植到旧代码中。

estimatedItemSize是iOS
8吃苹果最新推出的暗魔法,可以让CollectionView中吗能够让 cell
自适应内容大小,达到机关适应高度的预想效应!

而你的花色遭到尚无 Masonry,你可由此第三正在管理平台 Cocoapods
来下载,如果起趣味的话,可以拘留一下自身之前整理的有关 Cocoapods
下载和安装之篇章: IOS依赖管理 –
CocoaPods.

UICollectionView的万丈自适应的规律:

先是简单介绍一下 Masonry,Masonry
是一样舒缓能被开发者十分轻采取iOS的自行布局(AutoLayout)机制。Masonry提供更加周到、友好之API来代表直接动用NSLayoutConstraint进行编程,能够如视图布局之长河越是轻松。(好吧我肯定当时词话是自拷贝过来的,这不是重要)

1.CollectionView根据 layout 的 estimatedItemSize 算有估算的
contentSize,有了 contentSize CollectionView就开始显示

要自我对 Masonry
最初的认是经这篇稿子:Masonry介绍与祭实行:快速达标手Autolayout –
 CocoaChina 苹果支付中文站 – 最热之iPhone开发社区 最暖的苹果支付社区
最热之iPad开发社区,并且我发现网及流传的大部分关于
Masonry 的稿子基本都来自于斯,所以一旦你针对 Masonry
一点了解都没有,这篇文章确实是十分正确的。

2.CollectionView 以亮的经过遭到,即将被出示的 cell 根据 autolayout
的束缚算出自适应内容的 size

前期都铺垫了了,接下我们就是省我是怎么样把原本好的代码改化了
Autolayout 的精美的代码的了

3.layout 从 CollectionView 里拿走更新了的 size attribute

立即是一个饼图的控件:

4.layout 返回最终的 size attribute 给 CollectionView

图片 1

5.CollectionView 使用这最终之 size attribute 展示 cell

之前的代码是这般的:

UICollectionView的高度自适应的实现:

由此 initWithFrame 初始化控件的时候传进的 frame
计算饼图的半径,根据计算出来的半径确定各个 view 的摆位置:

  1. 设置 estimatdItemSize

– (id)initWithFrame:(CGRect)frame{

    self = [super initWithFrame:frame];

    if(self){

         self.backgroundColor = [UIColor clearColor];

         //UIScollView 容器

         _scrollContentView = [[UIScrollView alloc]
initWithFrame:self.bounds];

         _scrollContentView.backgroundColor = [UIColor clearColor];

         [self addSubview:_scrollContentView];

         //饼图

         _pieView = [[UIView alloc] initWithFrame:self.bounds];

         _pieView.backgroundColor = [UIColor clearColor];

         [_scrollContentView addSubview:_pieView];

         //饼图中心白色信息区域

         _infoView = [[UIView alloc] initWithFrame:self.bounds];

         _infoView.backgroundColor = [UIColor whiteColor];

         [_scrollContentView addSubview:_infoView];

         //颜色说明

         _descriptionView = [[UIView alloc]
initWithFrame:self.bounds];

         _descriptionView.backgroundColor = [UIColor clearColor];

         [_scrollContentView addSubview:_descriptionView];

         //计算饼图半径

         self.pieRadius = MIN(self.bounds.size.width/2,
self.bounds.size.height/2) – kMarginX*2;

         self.pieCenter = CGPointMake(self.bounds.size.width/2,
_pieRadius + kMarginY);

         _animationArr = [NSMutableArray array];

         self.textRadius = _pieRadius –
(_pieRadius-kInfoRadius)/2;

         }

    return self;

}

– (void)setPieCenter:(CGPoint)pieCenter{

    [_pieView setCenter:pieCenter];

    [_infoView setCenter:pieCenter];

    //这个点是利于用来在饼图上面画扇叶用的,是坐饼图也尺度的中心值

    _pieCenter = CGPointMake(_pieView.frame.size.width/2,
_pieView.frame.size.height/2);

}

– (void)setPieRadius:(CGFloat)pieRadius{

    _pieRadius = pieRadius;

    CGRect frame = CGRectMake(_pieCenter.x – pieRadius, _pieCenter.y

  • pieRadius, pieRadius*2, pieRadius*2);

    _pieCenter = CGPointMake(frame.size.width/2,frame.size.height/2);

    //设置饼图 frame

    [_pieView setFrame:frame];

    [_pieView.layer setCornerRadius:_pieRadius];

    CGFloat infoRadius = kInfoRadius;

    frame = CGRectMake(_pieCenter.x – infoRadius, _pieCenter.y –
infoRadius, infoRadius*2, infoRadius*2);

    //设置白色信息图 frame

    [_infoView setFrame:frame];

    [_infoView.layer setCornerRadius:infoRadius];

}

安 UICollectionViewFlowLayout 的 estimatdItemSize 的预估高度

打地方的代码,你应该会收看代码原来的逻辑顺序,这样处理代码的目的就是通过在初始化这个控件的早晚就是依据加的
frame
宽高取最小值作为饼图的直径,进而确定饼图以及白色信息图的frame,但是前提我正说了,一切还成立以
frame 是一个让有底固定值的根基及的。我这样说公恐怕会见当奇怪,frame
本来就是是一个固定好的适的CGRect 啊什么破啊是休是神经啊
那么什么状况下而并不知道 frame
到底是有些也?那便是自己在初始化这个控件的时光吗因而了
AutoLayout,也就是说我当上一个界面就经自律来保管之控件的布局,那么自己独自需要加以约束规范虽好并不需要传一个稳住的价值来让这个控件,像这样:

UICollectionViewFlowLayout *layout = [[UICollectionViewFlowLayout
alloc] init];

WS(weakSelf);

_pie = [[PieChart alloc] initWithFrame:CGRectZero];

_pie.dataSource = self;

[self.view addSubview:_pie];

[_pie mas_makeConstraints:^(MASConstraintMaker *make) {

    make.edges.equalTo(weakSelf.view);

}];

layout.estimatedItemSize = CGSizeMake([[UIScreen mainScreen]
bounds].size.width, 200);

即比如你瞧的,我当初始化的当儿并没受起一个稳好的卓有成效的
frame,而是加了同句子约束原则,这同样词话的意思就是是 pie 的轻重要跟当前的
view 一样特别,是的,这一切都是自动的。

estimatdItemSize 的默认值为 CGSizeZero ,所以如果给一个非0值开启高度估算。

那现在自我若做的便是给 pie 里面的一对控件也 autoLayout,但是本人要待将
view 的 frame 告诉 pie,因为我原本有一个逻辑是需要取frame
宽高顶小价来当饼图的直径的,真恼人,那么我们就是该想方告诉 pie
我现之 frame 是多老,你还来做相应调整。好吧,我先来打招呼 pie:

2.对cell 进行约添加

-(void)viewWillAppear:(BOOL)animated{

    [super viewWillAppear:animated];

    _pie.frame = self.view.bounds;

}

#import”LastCell.h”

这就是说现在己在 pie 里即使需要改变了:

#import”Masonry.h”

– (id)initWithFrame:(CGRect)frame{

    self = [super initWithFrame:frame];

    if(self){

          self.backgroundColor = [UIColor clearColor];

         WS(weakSelf);

         _scrollContentView = [[UIScrollView alloc]
initWithFrame:self.bounds];

         _scrollContentView.backgroundColor = [UIColor
clearColor];

         [self addSubview:_scrollContentView];

         [_scrollContentView
mas_makeConstraints:^(MASConstraintMaker *make) {

              //重点来了,scrollview 要求跟当前 view 一边大

              make.edges.equalTo(weakSelf);

         }];

         __weak UIScrollView *weakScroll = _scrollContentView;

         _pieView = [[UIView alloc] initWithFrame:self.bounds];

         _pieView.backgroundColor = [UIColor clearColor];

         [_scrollContentView addSubview:_pieView];

         [_pieView mas_makeConstraints:^(MASConstraintMaker *make)
{

              //饼图中心点 X 值要同 scrollview 一样,头部要当
scrollview 上留起kMarginY大小的距离

              make.centerX.equalTo(weakScroll.centerX);

             
make.top.equalTo(weakScroll.top).with.offset(kMarginY);

         }];

         __weak UIView *weakPie = _pieView;

         _infoView = [[UIView alloc]
initWithFrame:self.bounds];

         _infoView.backgroundColor = [UIColor whiteColor];

         [_scrollContentView addSubview:_infoView];

         [_infoView mas_makeConstraints:^(MASConstraintMaker
*make) {

              //白色信息图的为主点 X 值 Y 值都要同饼图一样

              make.centerX.equalTo(weakPie.centerX);

              make.centerY.equalTo(weakPie.centerY);

         }];

         _descriptionView = [[UIView alloc]
initWithFrame:self.bounds];

         _descriptionView.backgroundColor = [UIColor clearColor];

         [_scrollContentView addSubview:_descriptionView];

         [_descriptionView mas_makeConstraints:^(MASConstraintMaker
*make) {

              //颜色说明 view 的增长率要跟 scrollview
一样,头部要在饼图底部距离kPieDesSpace的岗位

              make.width.equalTo(weakScroll);

             
make.top.equalTo(weakPie.bottom).with.offset(kPieDesSpace);

         }];

   }

    return self;

}

-(void)setFrame:(CGRect)frame{

    [super setFrame:frame];

    self.pieRadius = MIN(self.bounds.size.width/2,
self.bounds.size.height/2) – kMarginX*2;

    _animationArr = [NSMutableArray array];

    self.textRadius = _pieRadius – (_pieRadius-kInfoRadius)/2;

    //注意这里用的是
update,因为自身前就针对性他们设置过约,我只是怀念上加新的约,如果还是用make
的讲话之前的拥有约束都见面劳而无功,如果用 remake
的语句就是拿前面的附和约束替换掉。因为自己现在已亮 frame
了,现在自家可以用她们的深浅进行封锁了

    [_pieView updateConstraints:^(MASConstraintMaker *make) {

         make.size.mas_equalTo(CGSizeMake(_pieRadius*2,
_pieRadius*2));

    }];

    [_infoView updateConstraints:^(MASConstraintMaker *make) {

         make.size.mas_equalTo(CGSizeMake(kInfoRadius *2,
kInfoRadius *2));

    }];

}

– (void)setPieRadius:(CGFloat)pieRadius{

    _pieRadius = pieRadius;

    [_pieView.layer setCornerRadius:_pieRadius];

    [_infoView.layer setCornerRadius:kInfoRadius];

}

@implementationLastCell

完成。

-(instancetype)initWithFrame:(CGRect)frame{

本人一度休思再说什么呀,这个代码为毛只能一行一行的复制粘贴进去什么!并且我的空格怎么还丢掉了什么!我是手动的敲的这些空格啊!!手还抢抽筋了呀什么什么!!!

self= [super initWithFrame: frame];

好吧,其实是复制粘贴代码这么难用我要坚持着手动一行一行复制粘贴下来空格敲的这么完美,都是为自身之好情人当扶自己选择我太爱吃的樱桃准备为我寄过来!我不由得哼起歌来~一想开就呀~就让我乐~贴一张图馋馋你们哈哈哈!

if(self) {

图片 2

self.backgroundColor= [UIColor whiteColor];

噢噢太激动了忘记了总结

self.testLabel= [UILabel new];

骨子里一开始用autolayout我是拒绝的,想到要xb、sb还闹官方那么繁琐的语喔喔还有特别看无亮堂的象形文字我不怕全身脑袋疼!但是本时有发生矣这般好之Masonry,就模仿来所以用吧,毕竟苹果之屏幕大小都起不平等了,用一个有情人之口舌来说,autolayout是方向。不管怎样,了解下连续好的

[self.contentView addSubview: self.testLabel];

self.testImage= [UIImageView new];

[self.contentView addSubview: self.testImage];

self.testLabel.numberOfLines=0;

self.testImage.backgroundColor= [UIColor redColor];

self.testLabel.backgroundColor= [UIColor purpleColor];

[self creatAutoLayout];

}

returnself;

}

– (void)creatAutoLayout{

[self.contentView mas_makeConstraints:^(MASConstraintMaker*make) {

make.left.top.mas_equalTo(0);

make.width.mas_equalTo(300);

make.bottom.mas_equalTo(self.testLabel.mas_bottom).offset(12.0);

}];

[self.testImage mas_makeConstraints:^(MASConstraintMaker*make) {

make.left.width.top.mas_equalTo(self.contentView);

make.height.mas_equalTo(150);

}];

[self.testLabel mas_makeConstraints:^(MASConstraintMaker*make) {

make.top.mas_equalTo(self.testImage.mas_bottom).offset(10.0);

make.left.width.mas_equalTo(self.testImage);

}];

}


(UICollectionViewLayoutAttributes*)preferredLayoutAttributesFittingAttributes:(UICollectionViewLayoutAttributes*)layoutAttributes
{

[self setNeedsLayout];

[self layoutIfNeeded];

CGSize size = [self.contentView systemLayoutSizeFittingSize:
layoutAttributes.size];

CGRect cellFrame = layoutAttributes.frame;

cellFrame.size.height= size.height;

layoutAttributes.frame= cellFrame;

return layoutAttributes;

}

@end


传送门