89

我有一个 uitableview 可以在每个单元格中加载相当大的图像,并且单元格的高度取决于图像的大小。滚动性能不错,但有时会很生涩。

我在 FieryRobot 博客上找到了以下提示:

带有uitableview的玻璃滚动

more-glassy-scrolling-with-uitableview

有没有人有任何提高 uitableview 滚动性能的提示?

4

5 回答 5

157
  1. 缓存行的高度(表格视图可以经常请求这个)
  2. 为表中使用的图像创建最近最少使用的缓存(并在收到内存警告时使所有非活动条目无效)
  3. UITableViewCell如果可能,请在's中绘制所有内容,drawRect:不惜一切代价避免子视图(或者如果您需要标准的可访问性功能,则使用内容视图drawRect:
  4. 使您UITableViewCell的图层不透明(如果您有内容视图,则内容视图也是如此)
  5. 使用UITableView示例/文档推荐的 reusableCellIdentifier 功能
  6. 避免未预烘焙到UIImages中的渐变/复杂图形效果
于 2009-08-29T22:57:59.977 回答
40
  1. 如果您是子类 UITableViewCell化,请不要使用 Nib,而是用代码编写它。它比加载 Nib 文件快得多。
  2. 如果您正在使用图像,请确保您正在缓存它们,这样您就不必为每个文件多次加载(如果您有内存——您会惊讶于图像占用了多少空间)。
  3. 使尽可能多的元素不透明。同样,尽量不要使用具有透明度的图像。
于 2009-08-29T22:11:20.973 回答
34

Tweetie 背后的开发人员对此进行了大量的写作,并提供了一些代码来演示该应用程序是如何完成的。基本上,他/她提倡每个表格单元格有一个自定义视图,并手动绘制它(而不是使用 Interface Builder 进行子视图,以及其他选项)。

带有uitableview的快速滚动推文

此外,Apple 在其 TableViewSuite 教程中更新了自己的 TableView 示例代码(也许是为了回应这个?)

表视图套件

于 2009-10-26T03:03:51.357 回答
1

UITableView 滚动的#1 性能杀手是在任何单元格视图层上绘制阴影,所以如果滚动性能很重要,那么不要做阴影,除非它基本上不会减慢你的主线程。

认为必须说这一点,因为没有一个公认的答案提到阴影和图层。:+)

于 2014-06-27T06:09:42.093 回答
0

滚动性能的任何问题UITableView都可以使用其他答案中已经描述的技术来解决。然而,很多时候,性能迟缓是由于某些固有的错误或重复性造成的。

重用单元的事实UITableView,以及每个单元可能需要自己的图像的事实 - 一起使解决方案有点复杂。从一般的解决方式来看,这里我总结一下应该注意的事项:

  1. 将数据加载到数据源 - 从 REST / 数据库。这一步应该在后台完成,最终使用 dispatch_async 和 GCD 队列。
  2. 创建并初始化相关的数据模型对象并将它们放入一个数组中
  3. [tableView reloaddata]
  4. 在内部cellForRowAtIndexPath,包含将从数组的正确数据模型对象设置数据(文本)的代码。
  5. 现在图像也可能采用 URL 的形式,所以这一步可能有点古怪,因为表格视图完成了单元格重用。事实的核心是使用异步队列从设备缓存/ URL 再次加载图像,然后将其设置为正确的 cell.image (无论您的单元格图像属性是什么)。

为避免出现问题,请参阅有关在表格视图中延迟加载图像的教程。

于 2016-01-16T13:23:23.323 回答