我已经开始使用具有不同单元格高度和内容的 UICollectionView 开发具有类似 pinterest 布局的应用程序。我已经定义了一个模板单元格(标签 + UIImageView),它通过 cellForItemAtIndexPath 回调来使用。
在该特定函数 (cellForItemAtIndexPath) 中,我正在修改 UIImageView 元素的内容 (UIImage) 和大小,以尊重新图像的比例并使用当前单元格的整个宽度。
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
FRGWaterfallCollectionViewCell *waterfallCell = [collectionView dequeueReusableCellWithReuseIdentifier:WaterfallCellIdentifier forIndexPath:indexPath];
[waterfallCell.layer setMasksToBounds:YES];
[waterfallCell.layer setCornerRadius:10.0];
[waterfallCell.layer setBorderWidth:1.0];
[waterfallCell.layer setBorderColor:[[UIColor darkGrayColor] CGColor]];
[waterfallCell.layer setNeedsDisplayOnBoundsChange:YES];
// some variables init
.....
// Get the new image
UIImage *image = [UIImage imageNamed: [NSString stringWithFormat: @"photo_%d.jpg", no_image]];
// Compute the image ratio
CGFloat largeur_img = image.size.width;
CGFloat hauteur_img = image.size.height;
CGFloat viewRatio = hauteur_img / largeur_img;
// Modify the UIImageView frame
CGRect cadre = waterfallCell.img_doc.frame;
<b>waterfallCell.img_doc.frame = CGRectMake(cadre.origin.x,cadre.origin.y,cadre.size.width, ceil(cadre.size.width * viewRatio));</b>
// We set the image of the UIImageView
<b>[waterfallCell.img_doc setImage:image];</b>
// Force to redraw the cell
<b>[waterfallCell setNeedsDisplay];</b>
return waterfallCell;
}
但是,此单元格不会刷新或重绘...除非我向下滚动 UICollectionView 并返回顶部,然后每个单元格的 UIImageView 都处于正确的形状。我在网上搜索过,看到很多关于 setNeedsDisplay 的帖子,但这里似乎 Cell 使用了 CALayer,所以它不关心。我知道主线程上的刷新,但我不知道如何触发此刷新是为了在第一次显示时获得具有正确尺寸的正确子 UIImageView 的正确单元格。
谢谢你的帮助,
问候
尼古拉斯