iOS5:UITableView 滚动性能不佳

Posted

技术标签:

【中文标题】iOS5:UITableView 滚动性能不佳【英文标题】:iOS5: UITableView poor scrolling performance 【发布时间】:2012-04-04 23:01:56 【问题描述】:

首先,我在滚动 tableview 时遇到内存泄漏。与here 相同的问题。

另外,我的滚动速度足够快,但是当我滚动它时它“有点颤抖”。细胞可重复使用。

代码:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

    static NSString *CellIdentifier = @"Cell";

    Country *country=[[self.items objectAtIndex:[indexPath section]] objectAtIndex:[indexPath row]];
    CountryCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    cell.imageView.image=[UIImage imageNamed:country.countryFlag];
    cell.countryName.text=country.countryName;
    cell.currencyCode.text=country.code;
    cell.currencyOriginalName.text=country.originalUnitName;

    return cell;

应用:ios 5、ARC、Storyboard。

这种 tableView 行为的真正原因是什么以及如何解决它?

【问题讨论】:

您是否将 CountryCell 笔尖的单元格 ID 设置为“单元格”?您是否使用 registerNib:forCellReuseIdentifier: 注册了笔尖? 单元格是否使用自定义高度或其他已知性能问题的委托方法? country.countryFlag 图片有多大?该图像来自哪里? 这真的是你的代码吗,因为我一开始看不到你在哪里创建 CountryCell。您应该检查 cell 不是 nil 并创建一个新的 CountryCell 如果它是。在 cell 不再返回 nil 之前,您至少应该创建两个单元格(如果每个单元格与您的表格一样大,则为 2 个)。 @NathanDay - 对于故事板,出队总是返回一个单元格,如果它是一个新的,它会从故事板原型创建它。 【参考方案1】:

如果您的设备滚动效果不佳,您可能没有在原型中正确配置您的子视图。在上述方法中,您没有做任何昂贵的事情。

使用核心动画工具(仅限设备)- 在滚动时检查每秒帧数。您希望尽可能接近 60fps。

打开“颜色混合图层” - 任何绘制透明的东西都将以红色突出显示。如果可能,您希望从您的单元格中删除所有透明度,并将它们全部设为绿色。这可能只是在原型子视图中正确设置背景颜色和不透明标志的问题。

如果您的图像与图像视图的大小不同,那么每次出现单元格时您都会调整大小,这也是一项昂贵的操作。

【讨论】:

为了更详细地说明这一点,没有明显的理由让它变慢。还有一些与此代码无关的事情发生。 @jrturton 好的。如果存储在沙箱中的每个单元格的图像都是 150x100,然后 UIImageView 自动将其大小调整为 38x31,这可能是性能不佳的原因吗?坦白说,不觉得图片这么大,是吗? 调整大小很昂贵。你可以注释掉那部分,看看效果。但你真的应该使用 Instruments 而不是猜测。 啊!交叉的 cmets。你在使用仪器! @jrturton 另外,还有一个问题 cell.imageView.image=[UIImage imageNamed:country.countryFlag];线。我已经摆脱了 imageNamed 方法,现在使用 withContentOfFile: 方法。因为你知道区别,它提高了我的表现。此外,我调整了图像的大小,最终得到了 ≈60 fps。好吧,现在还有另一个问题:为什么我的图像在 Retina 屏幕上如此不清晰,但这是另一个问题。将谷歌它。感谢您的回答并教我如何在 Instruments 中检查滚动性能。这对我来说是新的。

以上是关于iOS5:UITableView 滚动性能不佳的主要内容,如果未能解决你的问题,请参考以下文章

UITableView滚动性能优化

iOS PFBatchFaultingArray - 导致 UITableView 性能不佳(?)

heightForRowAtIndexPath 和 UITableView scrollToBottom 的初始加载性能不佳

下载 JSON 时如何解决 UITableView 滚动性能滞后的问题?

UITableView 的 iCarousel 性能问题(iPad 主从 UI)

UICollectionView 滚动性能不佳