iOS:重用 UITableViewCell 的 imageView 属性不尊重 contentMode 或 clipsToBounds [重复]
Posted
技术标签:
【中文标题】iOS:重用 UITableViewCell 的 imageView 属性不尊重 contentMode 或 clipsToBounds [重复]【英文标题】:iOS: Re-used UITableViewCell's imageView property does not respect contentMode or clipsToBounds [duplicate] 【发布时间】:2012-10-08 18:39:00 【问题描述】:可能重复:Changing bounds of imageView of UITableViewCell
我有一个自定义 UITableViewController
,并且在其中我动态地设置了 UITableViewCell
的样式,样式为 UITableViewCellStyleSubtitle
。一切都很好,除了当一个单元被重新使用时,它的imageView
属性不尊重我的contentMode
或clipsToBounds
设置。理想情况下,我希望内容遵循默认大小/形状(我认为是 40x40 正方形)。
还有其他帖子(下面的链接)建议对UITableViewCell
进行子类化,或重新调整图像大小以完全适合,但这两种方法都感觉像是变通方法,并且(恕我直言)鉴于我已经在拉动我的代码过于复杂小(非方形)图像。
建议子类化 UITableViewCell: Changing bounds of imageView of UITableViewCell
建议调整所有图片的大小: UITableViewCell's imageView fit to 40x40
示例代码:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
static NSString *kCellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:kCellIdentifier];
if (!cell)
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:kCellIdentifier];
NSString *mainText = @"mainText";
NSString *subtitle = @"subText";
[[cell textLabel] setText:mainText];
[[cell detailTextLabel] setText:subtitle];
// get album cover
UIImage *imageForCell = [album objectForKey:@"coverImage"];
// this is the broken part -
// it works upon first load, but it is NOT applied when a cell is re-used/dequeued..
// instead, the image is displayed un-scaled and un-square
[[cell imageView] setAutoresizingMask:UIViewAutoresizingFlexibleHeight|UIViewAutoresizingFlexibleWidth];
[[cell imageView] setContentMode:UIViewContentModeScaleAspectFill];
[[cell imageView] setClipsToBounds:YES];
if (imageForCell)
[[cell imageView] setImage:imageForCell];
else
/* code to retrieve custom image */
return cell;
什么给了? UITableViewCell 中是否有错误?还是出于某种设计原因?
【问题讨论】:
(我怀疑autoresizingMask
在这种情况下毫无意义,但我发现其他一些帖子引用了它,所以我将它包括在内只是为了彻底......)
答案很简单,UITableViewCell 实现了-layoutSubviews
,它考虑了图像/文本的大小。子类化 UITableViewCell 真的不是那么难,并且可以使您的代码更简单(通过将所有单元格逻辑移动到 setter 方法或类似方法中)。如果你不喜欢过多的子类化,你也可以在cell.contentView
中放置一个自定义视图并使用自动调整大小,但你也需要在那里自己的标签。
@tc。 - 如果您想将其放入答案中,我将标记已回答的问题以供将来的搜索者使用。谢谢!
【参考方案1】:
我很确定 Apple 声称在布局方面拥有 textLabel、detailTextLabel 和 imageView 的所有权,所以我认为您不能称其为缺陷。
-tableView:willDisplayCell:forRowAtIndexPath:
是一个专门用于格式化单元格布局的 API。你应该有更好的运气在那里进行格式更改。
尽管文档暗示了什么,但还是没有用。
【讨论】:
我不确定这是否足够——如果表格宽度发生变化,单元格将需要重新布局,这可能在屏幕旋转期间发生。 @Jeffrey Thomas:您的第一段似乎是对的,但不幸的是,-tableView:willDisplayCell:forRowAtIndexPath:
无法解决这里的问题。将寻求@tc 的推荐。 - 谢谢。
澄清:“不起作用” == “不会强制单元格尊重其clipsToBounds
或contentMode
设置”
对不起,我不应该在没有先尝试测试用例的情况下发布。我会更新我的无效答案。以上是关于iOS:重用 UITableViewCell 的 imageView 属性不尊重 contentMode 或 clipsToBounds [重复]的主要内容,如果未能解决你的问题,请参考以下文章
iOS:重用 UITableViewCell 的 imageView 属性不尊重 contentMode 或 clipsToBounds [重复]
是否有带有标签和文本字段的可重用 UITableViewCell?