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 属性不尊重我的contentModeclipsToBounds 设置。理想情况下,我希望内容遵循默认大小/形状(我认为是 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 的推荐。 - 谢谢。 澄清:“不起作用” == “不会强制单元格尊重其clipsToBoundscontentMode 设置” 对不起,我不应该在没有先尝试测试用例的情况下发布。我会更新我的无效答案。

以上是关于iOS:重用 UITableViewCell 的 imageView 属性不尊重 contentMode 或 clipsToBounds [重复]的主要内容,如果未能解决你的问题,请参考以下文章

iOS:重用 UITableViewCell 的 imageView 属性不尊重 contentMode 或 clipsToBounds [重复]

UITableViewCell重用的问题

Cell的重用原理

是否有带有标签和文本字段的可重用 UITableViewCell?

iOS之tableView性能优化/tableView滑动卡顿?

iOS-UITableView重用机制