UITableViewCell具有背景图像和动态高度

时间:2012-06-14 15:57:57

标签: iphone objective-c ios uitableview

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

每个细胞也有一个背景图像,当然根据细胞的高度进行淀粉。

我正在绘制单元drawRect中的背景图像,如下所示:

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

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

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

1 个答案:

答案 0 :(得分: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的支柱和弹簧。