【问题标题】:UITableViewCell with background image and dynamic height带有背景图片和动态高度的 UITableViewCell
【发布时间】:2012-06-14 15:57:57
【问题描述】:

我有一个显示书籍列表的 tableView,每个表格单元格都包含“书籍名称”和“书籍描述”。单元格的高度由书籍描述的长度决定,因此单元格的高度不同。

每个单元格也有一个背景图像,当然会根据单元格的高度进行淀粉化。

我在单元格drawRect中绘制背景图像如下:

- (void)drawRect:(CGRect)rect
{
    UIImage *bgImage = [UIImage imageNamed:@"cell_BG.png"];
    bgImage = [bgImage stretchableImageWithLeftCapWidth:60.0 topCapHeight:60.0];
    [bgImage drawInRect:rect];
} 

此代码有效,问题在于滚动性能,它不像我想要的那样流畅。
我注意到主要问题是高度变化,这似乎触发了对所有单元格的 drawRect 调用,包括可重复使用的单元格。
(当我尝试为所有单元格设置相同的高度时,滚动性能显着提高,但我必须使用动态高度......)

有没有更好的方法来做到这一点,以便表格滚动得到改善?

【问题讨论】:

    标签: iphone objective-c ios uitableview


    【解决方案1】:

    您可能不想为UITableViewCell 的视图覆盖drawRect,因为drawRect 非常昂贵。

    尝试在原型单元格顶部放置UIImageView 并设置其图像(您可以通过编程方式执行此操作,也可以直接拖入界面构建器)。然后,您可以设置图像视图的帧大小以匹配其各自UITableViewCell 的动态高度。 UIImageView 针对图像进行了优化,因此这种方法应该运行更流畅。

    您可以在UITableViewController 中的 cellforRowAtIndexPath 方法中设置 imageView 的图像和帧大小。

    更新: 您可能还希望将内容模式设置为缩放并适合您的图像。

    来自 UIView 类参考: “contentMode - 提供视图内容的布局行为,而不是视图的框架。此属性还会影响内容如何缩放以适应视图以及是否缓存或重绘。”

    例如,只要视图的框架发生变化,就会调用 drawRect 重绘。

    可以编程设置:

    UIView* view = [[UIView alloc] initWithFrame:CGRectMake...etc];
    view.contentMode = UIViewContentModeRedraw; // for example
    

    或者只是通过在界面构建器中选择视图并在属性检查器中设置内容模式属性。我认为您正在寻找 UIContentModeScaleToFit 或类似的东西。此外,如果使用界面生成器,请在尺寸检查器中检查 UIImageView 的支柱和弹簧。

    【讨论】:

    • > "...drawRect 非常昂贵" - 据我所知,您通常会覆盖 drawRect 以获得更好的性能,而不是向单元格添加子视图。但我会试试你的方法,看看......
    • drawRect 通常是您使用 CoreGraphics 或其他库进行自定义绘图的入口点,使用 UIImageViews 可以更有效地处理图像。
    • 这也可以帮助你:stackoverflow.com/questions/5656014/…
    • > "您可能还想将内容模式设置为缩放并适合您的图像" - 你能解释一下吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-15
    • 1970-01-01
    • 2015-10-04
    • 1970-01-01
    相关资源
    最近更新 更多