美文网首页autolyoutiOS DeviOS开源项目
UICollectionView的高度自适应

UICollectionView的高度自适应

作者: Snow_L | 来源:发表于2017-04-14 11:08 被阅读8514次

    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


    传送门

    相关文章

      网友评论

      • 6bbba3902a7a:estimatedItemSize 如果一个UIcollectionview里面,有多种不同cell,只需要其中的一个cell自适应,改怎么配置呢
        Snow_L:@lyonLiu (UICollectionViewLayoutAttributes *) preferredLayoutAttributesFittingAttributes:(UICollectionViewLayoutAttributes *)layoutAttributes { [super preferredLayoutAttributesFittingAttributes:layoutAttributes]; UICollectionViewLayoutAttributes *attributes = [layoutAttributes copy]; attributes.size = CGSizeMake(80, 80); return attributes; }
        lyonLiu:@SnowBing 同问
        Snow_L:@小欣_27b2 看私信
      • 孤单雨凉:你在ios8系统上运行一下试试,严重bug
        Snow_L:@圭山人 //解决ios8上自动布局的问题
        - (BOOL) shouldInvalidateLayoutForBoundsChange:(CGRect)newBounds{
        return YES;
        }
        gwk_iOS:我们已经放弃8了 最低9 哈哈哈
        HuberCui:确实,层主解决了吗

      本文标题:UICollectionView的高度自适应

      本文链接:https://www.haomeiwen.com/subject/xdrwattx.html