Динамическое изменение размера UICollectionViewCell

У меня есть UICollectionView с 2 UILabel и UIImage с похожим расположением:

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

Label2 имеет переменное количество строк, разное между ячейками, и я хотел бы иметь возможность автоматически изменять размер UICollectionView height в соответствии с label2 height, чтобы позволить ему «автозаполнять» ячейку. Возможно ли это сделать в iOS?


person Cris    schedule 10.01.2013    source источник


Ответы (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;
}
person Muhammad Nabeel Arif    schedule 10.01.2013
comment
Почему это был принятый ответ, когда @Chris спрашивал о UICollectionViewCells? Не то же самое, что UITableViewCell... - person Greg Combs; 25.02.2015
comment
Согласен с Грегом. Не отвечает на вопрос. - person user2067021; 14.02.2016
comment
Обновлен ответ для расчета высоты UICollectionViewCell. - person Muhammad Nabeel Arif; 14.02.2016