我需要只有简单的UICollectionViewCell样式,每个单元格顶部都有单元格。像tableview一样。但我需要动态高度依赖于内容,大小内容是评论它可以变化。
我得到了 viewDidLoad中: [self.commentsCollectionView registerClass:[GWCommentsCollectionViewCell class] forCellWithReuseIdentifier:@"commentCell"];
在.h我得到了:
和我#import我的自定义UICollectionViewCell,用编程自动布局设置所有约束。
我使用:
实例化UICollectionViewUICollectionViewFlowLayout *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值
如何解决这个问题以获得每个细胞所需的合适尺寸?
答案 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)