autolyoutiOS DeviOS开源项目

UICollectionView的高度自适应

2017-04-14  本文已影响8514人  Snow_L

estimatedItemSize是iOS 8中苹果最新推出的黑魔法,可以让CollectionView中也能让 cell 自适应内容大小,达到自动适应高度的预期效果!

UICollectionView的高度自适应的原理:

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

2.CollectionView 在显示的过程中,即将被显示的 cell 根据 autolayout 的约束算出自适应内容的 size

3.layout 从 CollectionView 里获取更新过的 size attribute

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

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

UICollectionView的高度自适应的实现:

1. 设置 estimatdItemSize

设置 UICollectionViewFlowLayout 的 estimatdItemSize 的预估高度

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

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

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

//解决ios8上自动布局的问题

- (BOOL) shouldInvalidateLayoutForBoundsChange:(CGRect)newBounds{

    return YES;

}

2.对cell 进行约束添加

#import"LastCell.h"

#import"Masonry.h"

@implementationLastCell

-(instancetype)initWithFrame:(CGRect)frame{

self= [super initWithFrame: frame];

if(self) {

self.backgroundColor= [UIColor whiteColor];

self.testLabel= [UILabel new];

[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


传送门

上一篇下一篇

猜你喜欢

热点阅读