【问题标题】:Efficiently resize UITableViewCell on scroll在滚动时有效地调整 UITableViewCell 的大小
【发布时间】:2012-05-11 17:20:41
【问题描述】:

总体思路

我希望在用户滚动列表时动态调整 UITableViewCells 的大小,也就是说,当项目到达列表底部时,它们的大小会增大。

注意事项

这是一个需要在调用时每秒刷新多次的过程:

-(void)scrollViewDidScroll:(UIScrollView *)scrollView

因此,采用UITableView::ReloadData 方法来调用:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 

因为这将需要重新加载大量额外数据并极大地降低系统速度。

需要

  • 我将在屏幕上显示大约 10 个项目。
  • 整个列表可能有多达 100 个极端案例的项目。
  • 系统需要平滑滚动。
  • 项目需要随着列表滚动而实时平滑地扩展和收缩。

常识

  • 与包含静态项的列表相比,这肯定会对性能产生一些影响。

  • 有数百个线程处理“将 cel 调整为文本长度”的简单情况,这不是我需要的,因为与每秒很多周期相比,这是一次性的。

可能的方法

  • 子类UITableView
  • 将静态UITableView 嵌套在UIScrollView 中。
  • 从头开始创建一个项目列表系统,根本不使用UIScrollView

废弃的方法

  • 每个周期调用UITableView::ReloadData,以便调用heightForRowAtIndexPath:。

到目前为止

我已经编写了一个模块来计算项目大小的数学。

结论

我正在寻找解决此问题的最快方法,但如果需要,我会在万不得已的情况下重新编码自己的 UITableView

感谢您的宝贵时间。

【问题讨论】:

  • @jacky 男孩,感谢您的编辑和观察。我删除了一些从未得到回答的问题,并键入了我找到的一些解决方案。我的大部分问题现在都得到了解答,除了我想弄清楚的两个。

标签: iphone ios uitableview real-time


【解决方案1】:

在使用UITableView 进行大量测试后,我还没有找到有效的方法。似乎UITableView 可能会以不允许动态调整单元格大小的方式进行优化。出于这个原因,制作自定义列表系统似乎是唯一的选择。我已经开始在UIScrollView 之上构建这样的项目。

大部分基本功能已完成,但该项目目前处于暂停状态,因为我目前有一个更重要的系统要开发。如果你有兴趣参与这个项目,请告诉我。

【讨论】:

    【解决方案2】:

    也许在 uitableview 委托数据表中查看 tableView:willDisplayCell:forRowAtIndexPath。

    http://developer.apple.com/library/ios/#documentation/UIKit/Reference/UITableViewDelegate_Protocol/Reference/Reference.html

    我有一个类似的问题,我需要先加载表格单元格,然后在加载或重新加载表格后对每个单元格执行不同的操作,这可能就是您要查找的内容。

    干杯

    【讨论】:

    • 不行,问题是你需要调用 UITableView::ReloadData 来改变单元格大小。由于我正在实时调整所有单元格的大小,因为 didScroll 被称为每秒对 UITableView::ReloadData 的大量调用将对性能产生巨大影响。
    • 哦,我明白了,是的,那不是最好的解决方案。祝你好运!
    【解决方案3】:

    您不需要调用 -[UITableView reloadData] 来更新单元格的几何形状。您可以通过调用使 UITableView 重新计算单元格的几何形状:

    // force geometry update
    [tableView beginUpdates];
    [tableView endUpdates];
    

    这在WWDC 2010 talk - Mastering Tableviews中提到

    【讨论】:

    • 虽然这确实有效,但根据我的测试,如果你调用它,它仍然运行得很慢:-(void) scrollViewDidScroll 以便在用户滚动时实时动态调整大小。您是否设法在没有对性能造成很大影响的情况下做到这一点@brian?
    猜你喜欢
    • 1970-01-01
    • 2015-11-02
    • 2016-01-14
    • 1970-01-01
    • 1970-01-01
    • 2021-07-24
    • 2013-03-07
    • 1970-01-01
    • 2012-03-03
    相关资源
    最近更新 更多