3

我只需要简单的 UICollectionViewCell 样式,每个单元格都位于每个单元格之上。像表格视图。但是我需要依赖于内容的动态高度,内容的大小是可以变化的评论。

我得到了 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 我有 UILabel、UIImageViews 等,所有这些都设置了 autolayoutcode。

但我只得到 (0,0) 的 cgsize 值

如何解决此问题以获得每个单元格所需的正确尺寸?

4

2 回答 2

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

}

然后,当您需要它时,使用基于键的字典来获取大小。

它不是一个真正超级漂亮的方式,因为它依赖于正在绘制的视图,自动布局在你获得大小之前会做它的事情。而且,如果您要加载更多图像,则可能会引发问题。

也许更好的方法是对尺寸进行预编程。如果您有关于图像尺寸的数据可能会有所帮助。查看这篇文章以获得非常好的教程(是的,以编程方式没有 IB):

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

于 2015-03-11T12:50:43.417 回答
-1

添加

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

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

return cell.singleCommentContainerview.bounds.size

它应该是

return GWCommentsCollectionViewCell.size(data)
于 2015-03-12T01:26:11.617 回答