Iphone 带背景图像和动态高度的UITableViewCell

Iphone 带背景图像和动态高度的UITableViewCell,iphone,objective-c,ios,uitableview,Iphone,Objective C,Ios,Uitableview,我有一个表视图,它显示一个图书列表,每个表单元格包括“图书名称”和“图书描述”。单元的高度由书籍描述的长度决定,因此单元具有不同的高度 每个细胞都有一个背景图像,当然,背景图像会随着细胞的高度而变化 我在cell drawRect中绘制背景图像,如下所示: - (void)drawRect:(CGRect)rect { UIImage *bgImage = [UIImage imageNamed:@"cell_BG.png"]; bgImage = [bgImage stretc

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

每个细胞都有一个背景图像,当然,背景图像会随着细胞的高度而变化

我在cell drawRect中绘制背景图像,如下所示:

- (void)drawRect:(CGRect)rect
{
    UIImage *bgImage = [UIImage imageNamed:@"cell_BG.png"];
    bgImage = [bgImage stretchableImageWithLeftCapWidth:60.0 topCapHeight:60.0];
    [bgImage drawInRect:rect];
} 
这段代码运行正常,问题在于滚动性能,它不像我希望的那样平滑。
我注意到主要问题是高度的变化,这似乎触发了对所有单元格的drawRect调用,包括可重用单元格。
(当我尝试为所有单元格设置相同的高度时,滚动性能显著提高,但我必须使用动态高度…)


是否有更好的方法来实现这一点,从而改善表格滚动?

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

尝试将
UIImageView
放置在原型单元格的顶部,并设置其图像(您可以通过编程方式进行设置,也可以在interface builder中拖动)。然后,可以将图像视图的帧大小设置为与其相应的
UITableViewCell
的动态高度相匹配
UIImageView
针对图像进行了优化,因此这种方法应该运行得更顺畅

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

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

从UIView类参考: contentMode-提供视图内容的布局行为,而不是视图的框架。此属性还影响内容的缩放方式以适应视图,以及内容是缓存还是重画

例如,只要视图的帧发生更改,redraw就会调用drawRect

可通过编程方式进行设置:

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

或者只需在interface builder中选择视图并在属性检查器中设置内容模式属性。我想你在寻找UIContentModeScaleToFit之类的东西。此外,如果使用interface builder,请在尺寸检查器中检查UIImageView的支柱和弹簧。

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

尝试将
UIImageView
放置在原型单元格的顶部,并设置其图像(您可以通过编程方式进行设置,也可以在interface builder中拖动)。然后,可以将图像视图的帧大小设置为与其相应的
UITableViewCell
的动态高度相匹配
UIImageView
针对图像进行了优化,因此这种方法应该运行得更顺畅

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

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

从UIView类参考: contentMode-提供视图内容的布局行为,而不是视图的框架。此属性还影响内容的缩放方式以适应视图,以及内容是缓存还是重画

例如,只要视图的帧发生更改,redraw就会调用drawRect

可通过编程方式进行设置:

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

或者只需在interface builder中选择视图并在属性检查器中设置内容模式属性。我想你在寻找UIContentModeScaleToFit之类的东西。此外,如果使用interface builder,请在size inspector中检查UIImageView的支柱和弹簧。

>“…drawRect非常昂贵”-据我所知,您通常会覆盖drawRect以获得更好的性能,而不是将子视图添加到单元格中。但我会试试你的方法,看看……drawRect通常是你使用CoreGraphics或其他库进行自定义绘图的入口点,使用UIImageView可以更有效地处理图像。这也可能会帮助你:>“你可能还想将内容模式设置为缩放和适合你的图像”-你能解释一下吗?>“…drawRect非常昂贵“-据我所知,u通常会重写drawRect以获得更好的性能,而不是将子视图添加到单元格中。但我会试试你的方法,看看……drawRect通常是你使用CoreGraphics或其他库进行自定义绘图的入口点,使用UIImageView可以更有效地处理图像。这也可能会帮助你:>“你可能还想将内容模式设置为缩放和适合你的图像”-你能解释一下吗?