我在自定义 TableViewCell 中有一个 UICollectionView,但我无法自动调整 CollectionView 的大小

Posted

技术标签:

【中文标题】我在自定义 TableViewCell 中有一个 UICollectionView,但我无法自动调整 CollectionView 的大小【英文标题】:I have a UICollectionView in a custom TableViewCell but I can't auto-resize the CollectionView 【发布时间】:2016-05-18 06:06:46 【问题描述】:

我在自定义UITableViewCell 中有一个UICollectionView,在UICollectionView 中只有UIImageView。我使用SDWebImage 加载图像。我想要的是在加载图像之后,UICollectionView 和它的 contentView(UITableViewCell) 都会更新自己的高度以显示所有图像。例如,如果我在UICollectionView 中有三张图片,我希望collectionview's 的高度等于所有三张图片的高度总和。 这是一些代码: 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):

- (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;

我使用自动布局并使用砖石来管理它。但无论我尝试修复它,它只会显示 20pt 高度。

ps:如何使CollectionViewCell框架适合图像框架

【问题讨论】:

【参考方案1】:

试试这个来计算高度

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

在你的自定义单元格中添加它并从 collectionview 委托方法中调用它

【讨论】:

首先,非常感谢。但我不明白我把这段代码放在哪个单元格显示?tableviewcell 还是 collectionviewcell?我应该调用哪个 collectionview 委托方法? 把它放在collectionviewcell中并从- (CGSize)collectionView:(UICollectionView )collectionView layout:(UICollectionViewLayout)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath方法调用

以上是关于我在自定义 TableViewCell 中有一个 UICollectionView,但我无法自动调整 CollectionView 的大小的主要内容,如果未能解决你的问题,请参考以下文章

使用包装标签增加 TableViewCell 高度

无法在自定义 TableViewCell 中编辑 UITextView

在自定义 tableviewcell 中更改 UIImage

TapGestures 在自定义 TableViewCell 中不起作用

iOS:为啥在自定义 TableViewCell 中写入此文本字段的文本似乎不可读

如何在自定义 tableViewCell 中初始化 UiPickerView?