【问题标题】:stretchableImageWithLeftCap: --> drawInRect -->very slow?stretchableImageWithLeftCap: --> drawInRect --> 很慢?
【发布时间】:2011-10-31 13:39:37
【问题描述】:

我的 tableView 中有可拉伸图像的问题。 直到今天,我使用了宽度为 320 像素的静态背景图像。

但由于我也想支持横向,我想我切换到可拉伸图像而不是使用单独的 png 文件。

我注意到的第一件事是滚动性能非常糟糕。 我没有改变其他任何东西。

之后我开始测量一段时间,并从可拉伸图像旁边的绘图例程中删除所有内容。

与使用与 backroundRect 大小相同的未拉伸图像相比,“drawContentView”方法需要 10 倍的时间。 随着拉伸的滞后很容易看到。没有它就像魅力一样。

static UIImage *greyBackground = nil;

+ (void)initialize
{
  greyBackground = [[[UIImage imageNamed:@"back_gray.png"]stretchableImageWithLeftCapWidth:65.0 topCapHeight:0.0]retain];
}


- (void)drawContentView:(CGRect)r {
  CGRect backgroundRect = contentView.bounds;

  [greyBackground drawInRect:backgroundRect];
}

这个性能真的那么差,还是这里有什么问题? 在 iPhone 4 上测试过,所以通常应该足够强大。 :-/

我已经考虑过缓存正确大小的图片而不是可拉伸的图片, 并在屏幕旋转后使用新尺寸重新创建它。

但我知道很多应用程序使用单元格背景图像和不同的单元格高度(例如 Twitter 又名 Tweetie)并且滚动速度仍然惊人。

那么,它通常应该更好地工作,还是我最好避免使用stretchableImageWithLeftCapWidth?

【问题讨论】:

  • 我对自定义单元格背景不是很熟悉,但是需要这个手动绘图吗? UIView 中没有背景图像属性吗?另外,缓存听起来很不错,如果没有其他方法,我会尝试使用自定义绘图功能。
  • 是的,要绘制的元素很多,用缓存对象自己绘制后的性能确实更好。只是stretchableImage 是问题所在。如您所见,可拉伸图像本身已经被缓存(静态指针和保留)。但如果没有其他解决方案,我将改为缓存最终图像。我只是想知道其他应用程序是如何做到的。与此单个可拉伸图像相比,整个单元格的其余部分(3 个字符串,5 个其他(不可拉伸)图像)的绘制时间不到一半:-/

标签: iphone objective-c


【解决方案1】:

我找到了解决问题的方法,但仍然无法相信这应该是stretchableImageWithLeftCap的正常行为:...

我现在将背景图片分成 3 部分。 - 左帽 - 中间部分(1px 宽度) - 右帽

左右大写用drawAtPoint绘制,middlePart用drawAsPatternInRect绘制。 绘制这 3 个缓存图像的速度或多或少与我原来的全尺寸 backgroundImage 一样快。

但我一直认为 stretchableImageWithLeftCap 也会这样做:在它们之间绘制 2 个 Caps 和 1px 图案。 不知道为什么对我来说这么慢。

【讨论】:

    猜你喜欢
    • 2011-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-22
    • 2011-03-08
    • 2013-02-23
    相关资源
    最近更新 更多