0

I have a UICollectionView in a custom UITableViewCell, only UIImageView in the UICollectionView. I use SDWebImage to load image.What I want is after loading the image, both UICollectionView and it's contentView(UITableViewCell) update themselves' height to show all the image. For example, if I have three images in UICollectionView, I hope the collectionview's height equals to all three images' height summation. Here is some code: TableView:

- (void)createPostDetailUI{
    _postDetailTableView = [UITableView new];
    _postDetailTableView.delegate = self;
    _postDetailTableView.dataSource = self;
    _postDetailTableView.estimatedRowHeight = 180;
    _postDetailTableView.tableFooterView = [UIView new];
    [_postDetailTableView setSeparatorStyle:UITableViewCellSeparatorStyleNone];
    _postDetailTableView.rowHeight = UITableViewAutomaticDimension;

    [self makeConstraints];
}

- (void)makeConstraints{
    [_postDetailTableView mas_makeConstraints:^(MASConstraintMaker *make) {
        UIEdgeInsets padding = UIEdgeInsetsMake(0, 0, 50, 0);
        make.edges.equalTo(self.view).insets(padding);
    }];
}

- (void)requestPostData{
    //some request code
    [_commentsArray addObjectsFromArray:[PostCommentModel arrayWithResponseObject:responseObject][0]];
    [_postDetailTableView reloadData];
}

-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{
    return 1;
}

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
    return _commentsArray.count;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
    PostDetailHeaderTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"PostDetailHeaderTableViewCell" forIndexPath:indexPath];
    cell = [[PostDetailHeaderTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"PostDetailHeaderTableViewCell"];
    [cell updateCellWithModel:_postModel];

    return cell;
}

UITableViewCell(UICollectionView inside it):

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier{
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
    if (self) {       
        //some other views

        UICollectionViewFlowLayout *layout = [[UICollectionViewFlowLayout alloc] init];
        layout.sectionInset = UIEdgeInsetsMake(0, 0, 0, 0);
        layout.minimumLineSpacing = 4.0;
        layout.estimatedItemSize = CGSizeMake(300, 300);
        _postImageCollectionView = [[UICollectionView alloc] initWithFrame:CGRectZero collectionViewLayout:layout];
        _postImageCollectionView.backgroundColor = [UIColor clearColor];
        _postImageCollectionView.showsHorizontalScrollIndicator = NO;
        _postImageCollectionView.autoresizesSubviews = YES;
        [_postImageCollectionView registerClass:[PostDetailImageCollectionViewCell class] forCellWithReuseIdentifier:@"PostDetailImageCollectionViewCell"];
        _postImageCollectionView.delegate = self;
        _postImageCollectionView.dataSource = self;
        [self.contentView addSubview:_postImageCollectionView];

        [self makeConstraints];
    }
    return self;
}

- (void)makeConstraints{
    //some other views' autolayout code

    [_postImageCollectionView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.left.equalTo(_postContentLabel);
        make.right.equalTo(_postContentLabel);
        make.top.equalTo(_postContentLabel.mas_bottom).offset(14);
        make.height.greaterThanOrEqualTo(@20);
        make.bottom.equalTo(self.contentView).offset(-16);
    }];
}

- (void)updateCellWithModel:(PostsModel *)model{

    _imageArray = [model getImageList];
    [_postImageCollectionView reloadData];
}

- (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView{
    return 1;
}

- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section{
    return _imageArray.count;
}

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath{
    PostDetailImageCollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"PostDetailImageCollectionViewCell" forIndexPath:indexPath];
    NSString *cellImageURL = _imageArray[indexPath.row];
    [cell.imageView sd_setImageWithURL:[NSURL URLWithString:cellImageURL] placeholderImage:[UIImage imageNamed:@"icon_default"]];

    return cell;
}

UICollectionViewCell:

- (instancetype)initWithFrame:(CGRect)frame{
    self = [super initWithFrame:frame];
    if (self) {
        _imageView = [UIImageView new];
        _imageView.frame = self.contentView.frame;
        _imageView.contentMode = UIViewContentModeScaleAspectFit;
        [self.contentView addSubview:_imageView];
    }
    return self;
}

I use auto layout and use masonry to manage it. But whatever I try to fix it, it just show me 20pt height.

ps:How to make CollectionViewCell frame fit image frame

David Hu
  • 67
  • 8

1 Answers1

0

Try this to calculate height

CGheight height= [self.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize].height+2;

add this in ur custom cell and call this from collectionview delegate method

user3306145
  • 76
  • 2
  • 12
  • First, thanks a lot. But I can't understand which cell show I put this code?tableviewcell or collectionviewcell? And which collectionview delegate method should I call? – David Hu May 18 '16 at 06:45
  • put this in collectionviewcell and call from - (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath method – user3306145 May 18 '16 at 06:47