设置UICollectionViewCell的高度

时间:2014-10-11 20:56:08

标签: ios objective-c uicollectionview uicollectionviewcell

我想根据单元格中内容的大小(特别是UILabel)更改UICollectionViewCell的高度。我在

中设置了UILabel高度
-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionViewcellForItemAtIndexPath:(NSIndexPath *)indexPath

然后我在

中设置UICollectionViewCell高度
- (CGSize)collectionView:(UICollectionView *)collectionView
                  layout:(UICollectionViewLayout *)collectionViewLayout
  sizeForItemAtIndexPath:(NSIndexPath *)indexPath

看起来第二种方法在第一种方法之前调用,因此尚未计算标签的高度。完整的代码如下(警告:需要整洁!)。有什么想法吗?

    -(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView
                 cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
    UICollectionViewCell *myCell = [collectionView
                                    dequeueReusableCellWithReuseIdentifier:@"Cell"
                                    forIndexPath:indexPath];


    label = [[UILabel alloc] initWithFrame:CGRectMake(80,10,width - 90,0)];
    label.text = @"Hellfoneofinerigoneriognwirotngwtngowirnthointgonowenfkqejb fgjkreb glknrlegkn ewlj qerlgjnweofjpeorihgpireghiperhgorgrngl;rtnh;ltm;l";
    label.lineBreakMode = NSLineBreakByWordWrapping;
    label.numberOfLines = 0;
    label.font = [UIFont fontWithName:@"HelveticaNeue-UltraLight" size:17];
    [label sizeToFit];

    [myCell.contentView addSubview:label];
    CGSize labelY = [label bounds].size;
    i = labelY.height;
    NSLog(@"Height: %d", i);


        return myCell;
}

#pragma mark <UICollectionViewDelegate>
- (CGSize)collectionView:(UICollectionView *)collectionView
                  layout:(UICollectionViewLayout *)collectionViewLayout
  sizeForItemAtIndexPath:(NSIndexPath *)indexPath
{

 NSLog(@"Height: %d", i);

    if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone)
    {
        CGSize result = [[UIScreen mainScreen] bounds].size;
        if(result.height == 568)
        {
           return CGSizeMake(300.f, i);

        }
        if(result.height == 667)
        {
          return CGSizeMake(340.f, i);

        }
        if(result.height == 736)
        {
          return CGSizeMake(370.f, i);


        }
    }
    return CGSizeMake(300.f, i);

}
编辑:没有真正解释错误。 <{1}}被调用时,i的高度等于零。

3 个答案:

答案 0 :(得分:0)

通过在高度方法中创建Label并确定其高度来进行工作。

答案 1 :(得分:0)

布局委托方法- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath将为 在数据源方法-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath之前执行,并sizeForItemAtIndexPath计算所有单元格的大小,然后开始构建它们。

所以,您应该只通过indexPath获取内容,然后计算显示的高度,在cellForItemAtIndexPath中应用高度值

答案 2 :(得分:0)

您尝试实施的是自我调整大小UICollectionViewCell。要实现这一点,您需要:

  • 为flowLayout
  • 设置estimatedItemSize
  • 将标签固定到顶部,底部,前端和后缘
  • 确保最后一个标签的Vertical Content Hugging Priority为250
  • 并在您的UICollectionViewCell
  • 中实施preferredLayoutAttributesFitting

我在这里写了一篇关于Self Sizing UICollectinViewCell的更长篇博文: http://parveenkaler.com/posts/self-sizing-uicollectionviewcell-swift