【问题标题】:ios 9 - tableview cell jumps when scrolling down/up when calling cellForRowAtIndexPathios 9 - 调用 cellForRowAtIndexPath 时向下/向上滚动时表格视图单元格会跳转
【发布时间】:2015-09-23 05:57:52
【问题描述】:

亲爱的程序员们,

我最近更新到 Xcode 7 和 Swift 2,现在,每当我向下或向上滚动时,屏幕都会跳动一点(没什么太疯狂的),但它会使导航变得迟钝。 每当我在调用 cellForRowAtIndexPath 时在屏幕上显示一个新单元格时,就会发生这种情况。

cellForRowAtIndexPath 中,对于每个 Cell,我实际上使用 HanekeSwift、标签和按钮(使用 switch、case、if 等)设置了一堆 imageView。

奇怪的是,每当我在 cellForRowAtIndexPath 中评论大部分设置时,跳跃的部分就消失了。

我已经尝试评论每个部分,但我没有设法检测到是什么导致了跳转部分。或者我想知道这是否与有很多治疗有关。

每个单元格的高度不同,我使用自动布局来检测每个单元格的高度。 timelineTableView.rowHeight = UITableViewAutomaticDimension 时间线表视图.estimatedRowHeight = 600

我也尝试实现estimatedHeightForRowAtIndexPath委托方法并手动计算每个单元格的高度,但没有成功。

任何人都知道为什么我会经历跳动的部分,以及为什么当我将所有内容都注释掉时,跳动就消失了?

更新 1: 在玩 Time Profiler 时(注释掉我的 cellForRowAtIndexPath 方法中的一些函数),我意识到当 cellForRowAtIndexPath 的运行时间低于 80-90ms 时,我看不到跳跃的部分。而且跑的时间越长,感觉跳的越多

【问题讨论】:

  • 在设备上运行时使用仪器中的时间分析器来查找慢行。但这是在细胞制备方法中要做的很多!您还通过根据设备尺寸进行切换来击败自动布局的要点:)
  • 您认为这可能与大量细胞制备有关吗?我有选择吗?我必须为每个 Cell 设置所有这些。
  • 并非所有这些都需要每次都完成。但是使用工具来找到你的慢代码,不要猜测。
  • 这是结果,我的 loadItem 函数中耗时最长的两个过程:imgur.com/JvPDFWw
  • 如果您使用动态大小的单元格(高度),请务必实现 heightForRowAtIndexPath 或estimateHeightForRowAtIndexPath

标签: ios xcode swift uitableview ios9


【解决方案1】:

根据您的仪器跟踪,创建和设置按钮图像几乎是所有时间。看起来像这部分:

// Approve Button && Disapprove Button
    if selfie.user_vote_status == 1 {
        self.approveButton.setImage(UIImage(named: "approve_select_button.png"), forState: .Normal)
        self.disapproveButton.setImage(UIImage(named: "reject_button.png"), forState: .Normal)
    } else if selfie.user_vote_status == 2 {
        self.approveButton.setImage(UIImage(named: "approve_button.png"), forState: .Normal)
        self.disapproveButton.setImage(UIImage(named: "reject_select_button.png"), forState: .Normal)
    } else {
        self.approveButton.setImage(UIImage(named: "approve_button.png"), forState: .Normal)
        self.disapproveButton.setImage(UIImage(named: "reject_button.png"), forState: .Normal)
    }

您可以先注释掉这部分代码来进行测试。

要解决此问题,您需要做两件事。首先,查看整个方法并尝试找出您每次都在重复哪些事情。这些东西需要移入初始化程序或设置在情节提要中,而不是每次运行时都被击中。

其次,无需继续创建和分配这些图像。批准按钮具有两个图像之一,拒绝按钮具有两个图像之一。您可以为 selected 状态设置一张图像,为 normal 状态设置一张图像(一次,在情节提要或初始化程序中),然后只需根据投票状态。

【讨论】:

  • 首先,非常感谢您的帮助!你能扩展一下关于进入初始化程序的内容吗?就像将每个 Cell 相同的所有代码都放入 awakeFromNib 方法中?
  • 是的,或者将其设置在笔尖或情节提要本身中。
  • 根据您的建议,我设法将 cellForRowAtIndexPath 的所有时间从 400 毫秒减少到 120 毫秒,但是,似乎不能低于 90 毫秒。还有其他建议吗?我有点惊讶,虽然一些简单的治疗会导致这种情况,因为我没有做任何疯狂的事情,只是设置图像和标签:(
猜你喜欢
  • 1970-01-01
  • 2019-03-10
  • 1970-01-01
  • 1970-01-01
  • 2021-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-12
相关资源
最近更新 更多