我开始使用具有不同单元格高度和内容的UICollectionView开发一个类似pinterest的应用程序。我已经定义了一个模板单元格(label + UIImageView),它通过cellForItemAtIndexPath回调使用。
在该特定函数(cellForItemAtIndexPath)中,我正在修改内容(UIImage)和UIImageView元素的大小以尊重新图像的比例并使用当前Cell的整个宽度。
- (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;
}
但是,这个Cell不刷新或重绘...除非我向下滚动UICollectionView并返回顶部,然后我的每个单元格的UIImageView都是正确的形状。我在网上搜索过,看过很多关于setNeedsDisplay的帖子但是在这里似乎Cell使用了CALayer所以它并不关心..我明白主线程刷新但我不知道怎么开火这个刷新是为了获得第一个显示,正确的单元格具有正确的子UIImageView及其正确的尺寸。
感谢您的帮助,
此致
尼古拉斯
答案 0 :(得分:0)
问题就在这里:
FRGWaterfallCollectionViewCell *waterfallCell = [collectionView dequeueReusableCellWithReuseIdentifier:WaterfallCellIdentifier forIndexPath:indexPath];
第一次打开控制器时,没有单元格要出列,因此waterfallCell将为零。 (如果您愿意,可以添加日志来验证这一点)。只有当你滚动时,单元格才会出列,这就是为什么只有当你滚动时才能看到差异。
当我使用自定义集合视图单元格时,我该怎么做:
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
static NSString *cellIdentifier = @"catalogOneRowCell";
LACatalogOneRowCell *catalogCell = [collectionView dequeueReusableCellWithReuseIdentifier:cellIdentifier forIndexPath:indexPath];
if (catalogCell == nil) {
catalogCell = [LACatalogOneRowCell getLACatalogOneRowCell];
}
这是LaCatalogOneRowCell.m
+ (LACatalogOneRowCell *)getLACatalogOneRowCell {
NSArray *xib = [[NSBundle mainBundle] loadNibNamed:@"LACatalogOneRowCell" owner:nil options:nil];
for (NSObject *obj in xib) {
if ([obj isKindOfClass:[LACatalogOneRowCell class]]) {
return (LACatalogOneRowCell *)obj;
}
}
return nil;
}
非常重要的是,在你的viewDidLoad中,注册你的单元格的笔尖:
UINib *nib = [UINib nibWithNibName:@"LACatalogOneRowCell" bundle:nil];
[catalogCollectionView registerNib:nib forCellWithReuseIdentifier:@"catalogOneRowCell"];
另外,我不建议在cellforRow中进行alocing:
UIImage *image = [UIImage imageNamed:...
与...相同 UIImage * image = [[[UIImage alloc] initWithImage:....] autorelease];
在cellForRow中分配对象对性能有害,尤其是像UIImage
这样的对象答案 1 :(得分:0)
在我看来,你应该根据比率出队。这将使您免于试图将所有内容放在一起的痛苦。无论发生什么,您的物品都会有一组极限比率。另外,我不确定你是否可以改变已经使用过的单元格的框架而不会开始大量重新加载视图,这在CPU方面会非常昂贵。