【问题标题】:Why would layoutIfNeeded be called upon scrolling the uitableviewcontroller?为什么在滚动 uitableviewcontroller 时会调用 layoutIfNeeded?
【发布时间】:2016-07-24 08:02:35
【问题描述】:

我正在尝试针对速度较慢的设备优化 UITableViewController,在消除了导致 tableview 速度慢的许多原因之后,我仍在尝试找出最后一个...

此屏幕截图来自仪器,显示了最昂贵的调用,在没有调用获取 heightForRowAtIndexPathcellForRowAtIndexPath 的时间段内(反复上下滚动约 10 像素而不会导致任何单元格离开表格或获取渲染)。

这是正常行为吗?如果页面内容没有变化,为什么视图需要重新布局?

【问题讨论】:

  • 作为健全性检查,您介意在此处粘贴您的表视图委托方法吗?

标签: ios performance uitableview uikit instruments


【解决方案1】:

每次滚动时,都会更改 contentOffsetcontentOffset 更新 bounds,特别是它的 origin。每个bounds 更改标记接收器以供下一个更新周期中的布局需要。在这种情况下,更新 frame 的浮动子视图,如滚动指示器、表格页眉和页脚……这是完全正常的行为,您无能为力。不用担心,您是在重新显示,而不是在重新绘制。

【讨论】:

    【解决方案2】:

    我们必须查看一些代码来确定调用该方法的确切原因,但至少可能是以下原因之一:

    1. 您的约束在滚动时被更改,即使您看不到它,它们可能会受到影响,可能在 UITableViewCell 内?
    2. 它与表格视图没有任何关系,视图只是有其他要布局的东西,也许您进行了约束修改...
    3. 您调用的方法显式调用它。

    还请记住,这只会在“需要时”布置视图。

    【讨论】:

    • 这是一个简单的表格视图...没有滚动相关的代码。唯一实现的方法是 viewdidload、索引路径处的行单元格和索引路径处的单元格高度(+ 行/节数)
    • 您是否可能在加载单元格的任何属性后对其进行设置? (例如,下载一张图片然后显示)
    猜你喜欢
    • 1970-01-01
    • 2010-10-31
    • 2019-09-16
    • 2014-09-19
    • 1970-01-01
    • 1970-01-01
    • 2016-07-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多