如何从其内容设置动态uicollectionviewcell大小 - 以编程方式

时间:2013-12-17 17:27:38

标签: ios objective-c uicollectionview uicollectionviewcell contentsize

我需要只有简单的UICollectionViewCell样式,每个单元格顶部都有单元格。像tableview一样。但我需要动态高度依赖于内容,大小内容是评论它可以变化。

我得到了 viewDidLoad中:

  [self.commentsCollectionView registerClass:[GWCommentsCollectionViewCell class] forCellWithReuseIdentifier:@"commentCell"];
在.h我得到了:     

和我#import我的自定义UICollectionViewCell,用编程自动布局设置所有约束。

我使用:

实例化UICollectionView
UICollectionViewFlowLayout *collViewLayout = [[UICollectionViewFlowLayout alloc]init];
self.commentsCollectionView = [[UICollectionView alloc]initWithFrame:CGRectZero collectionViewLayout:collViewLayout];

我使用autolatyout让UICollectionView成为我想要的地方(这就是CGRectZero的原因)。

最后我希望这样做:

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

    GWCommentsCollectionViewCell *cell = (GWCommentsCollectionViewCell*)[collectionView cellForItemAtIndexPath:indexPath];

    return cell.singleCommentContainerview.bounds.size;
}

singleCommentContainerview是contentView的直接子视图,有了singleCommentContainerview,我有UILabels,UIImageViews等,都设置了witih autolayoutcode。

但我只是获得了(0,0)的cgsize值

如何解决这个问题以获得每个细胞所需的合适尺寸?

2 个答案:

答案 0 :(得分:0)

根据我的阅读,UICollectionView需要在布局单元格之前确定尺寸。所以你的上述方法尚未被绘制,因此它没有大小。此外,它可能是一个问题,或者与使用相同标识符@" commentCell"缓存/池化的问题相结合,我通常使用新标识符和类标记唯一单元格。

我的想法是在绘制之前抓住单元格,将大小放入字典中以供日后使用:

- (void)collectionView:(UICollectionView *)collectionView
       willDisplayCell:(UICollectionViewCell *)cell
    forItemAtIndexPath:(NSIndexPath *)indexPath{

GWCommentsCollectionViewCell *cell = (GWCommentsCollectionViewCell*)[collectionView cellForItemAtIndexPath:indexPath];
// Need to add it to the view maybe in order for it the autolayout to happen
[offScreenView addSubView:cell];
[cell setNeedsLayout];

CGSize *cellSize=cell.singleCommentContainerview.bounds.size
NSString *key=[NSString stringWithFormat:@"%li,%li",indexPath.section,indexPath.row];
// cellAtIndexPath is a NSMutableDictionary  initialised and allocated elsewhere
[cellAtIndexPath setObject:[NSValue valueWithCGSize:cellSize] forKey:key]; 

}

然后当你需要它时,根据键使用该词典来获得大小。

它不是一个非常漂亮的方式,因为它依赖于绘制的视图,autolayout在你获得大小之前做它的事情。如果你加载的图像更多,它可能会引发问题。

也许更好的方法是预编程尺寸。如果您有可能有用的图像尺寸数据。查看这篇文章是否有一个非常好的教程(yah编程没有IB):

https://bradbambara.wordpress.com/2014/05/24/getting-started-with-custom-uicollectionview-layouts/

答案 1 :(得分:-1)

添加

class func size(data: WhateverYourData) -> CGSize { /* calculate size here and     retrun it */} 

到您的自定义单元格而不是

return cell.singleCommentContainerview.bounds.size

应该是

return GWCommentsCollectionViewCell.size(data)