动态调整 UICollectionViewCell 的大小

Posted

技术标签:

【中文标题】动态调整 UICollectionViewCell 的大小【英文标题】:Dynamically resizing a UICollectionViewCell 【发布时间】:2013-01-10 10:27:24 【问题描述】:

我有一个 UICollectionView 和 2 个 UILabel 和一个 UIImage 具有类似的布局:

 --------------------
 |                   |
 |    LABEL1         |
 |    IMAGE          |
 |    LABEL2         |
 |    ......         |
 |    ......         |
 --------------------

Label2 的行数可变,单元格之间不同,我希望能够根据label2 height 自动调整UICollectionView height 的大小,让它“自动填充”单元格。 在 ios 中可以做到吗?

【问题讨论】:

【参考方案1】:

您可以重写UICollectionViewDelegateFlowLayout的以下方法来动态计算UICollectionViewCell的高度,根据您的要求设置常量值。

-(CGSize) collectionView:(UICollectionView *)collectionView 
                  layout:(UICollectionViewLayout *)collectionViewLayout 
  sizeForItemAtIndexPath:(NSIndexPath *)indexPath

    UIFont *fontLabel1 = [UIFont systemFontOfSize:17];
    UIFont *fontLabel2 = [UIFont systemFontOfSize:14];
    int padding = 5;
    int maxWidthOfLabel = 300;
    CGSize maximumLabelSize = CGSizeMake(maxWidthOfLabel, CGFLOAT_MAX);

    NSString *strLabel1 = @"Label one text";// Get text for label 1 at indexPath
    NSString *strLabel2 = @"Label two text";// Get text for label 2 at indexPath

    NSStringDrawingOptions options = NSStringDrawingTruncatesLastVisibleLine |
    NSStringDrawingUsesLineFragmentOrigin;

    NSDictionary *attr1 = @NSFontAttributeName: fontLabel1;
    NSDictionary *attr2 = @NSFontAttributeName: fontLabel2;

    // Calculate individual label heights
    CGFloat heightLabel1 = [strLabel1 boundingRectWithSize:maximumLabelSize
                                                options:options
                                             attributes:attr1
                                                context:nil].size.height;
    CGFloat heightLabel2 = [strLabel2 boundingRectWithSize:maximumLabelSize
                                                options:options
                                             attributes:attr2
                                                context:nil].size.height;
    CGSize sizeOfImage = CGSizeMake(50, 50);

    // Calculate height based on all Views (2 Labels + 1 ImageView)
    CGFloat height = heightLabel1+heightLabel2+sizeOfImage.height+2*padding;
    CGFloat width = collectionView.frame.size.width;// Set width
    CGSize size = CGSizeMake(width, height);
    return size;

【讨论】:

当@Chris 询问 UICollectionViewCells 时,为什么这是公认的答案?和 UITableViewCell 不一样... 同意格雷格。不回答问题。 更新了计算 UICollectionViewCell 高度的答案。

以上是关于动态调整 UICollectionViewCell 的大小的主要内容,如果未能解决你的问题,请参考以下文章

调用 reloadData() 后自行调整动态 UICollectionViewCell 高度的大小不正确

在非滚动 UICollectionView 中动态调整 UICollectionViewCell 的大小

4.4 和 5.5 英寸的 UICollectionViewCell 动态调整大小

动态设置 UICollectionViewCell 的大小

iOS - UICollectionViewCell 的动态大小宽度

具有自动调整大小的 UICollectionViewCell 在 iOS 9 中不起作用,但在 iOS 10 中起作用