【问题标题】:Scrolling bottom in tableview and performance在表格视图和性能中滚动底部
【发布时间】:2016-07-14 20:09:13
【问题描述】:

我需要滚动到底部。我有一个像whatsapp这样的聊天应用程序。所以当视图出现时,表格视图应该显示最后一行。我通过以下方式实现了这一点并且效果很好。

tableView.setContentOffset(CGPointMake(0, CGFloat.max), animated: false)

当键盘出现时,我还需要滚动到底部。我正在使用自动布局,上面的行不起作用。为此,我使用以下行:

func scrollToLastRow(animated: Bool) {
    if self.numberOfRowsInSection(0) > 0 {
        self.scrollToRowAtIndexPath(NSIndexPath(forRow: self.numberOfRowsInSection(0) - 1, inSection: 0), atScrollPosition: .Bottom, animated: animated)
    }
}

这是 Tableview 的扩展。

当没有太多消息时,此解决方案可以正常工作。然后我尝试了 5000 条消息(所以 tableview 有 5000 行,但我正在分页它们)当键盘出现时,我看到 cpu 使用率为 %98-100。我认为第二个代码是分页问题,​​它会导致将每条消息加载到 ram 并且我的应用程序冻结并收到 ram 警告。

如何在没有任何性能问题的情况下滚动到底部?

【问题讨论】:

  • 您找到解决方案了吗?也使用领域。

标签: ios swift uitableview


【解决方案1】:

如果您有分页,您可以尝试只加载当前页面以及最后一页,假设每个页面中有 20 条消息,在这种情况下,您的表格只有 40 行。然后你就可以使用你的函数了:

func scrollToLastRow(animated: Bool) {
if self.numberOfRowsInSection(0) > 0 {
    self.scrollToRowAtIndexPath(NSIndexPath(forRow: self.numberOfRowsInSection(0) - 1, inSection: 0), atScrollPosition: .Bottom, animated: animated)
}

}

【讨论】:

  • 我正在使用领域,它有一个自动分页系统。所以我不能这样做。
【解决方案2】:

试试这个方法:

let delay = 0.1 * Double(NSEC_PER_SEC)
let time = dispatch_time(DISPATCH_TIME_NOW, Int64(delay))

     dispatch_after(time, dispatch_get_main_queue(), {

          let numberOfSections = self.tableView.numberOfSections
          let numberOfRows = self.tableView.numberOfRowsInSection(numberOfSections-1)
            if numberOfRows > 0 {
                let indexPath = NSIndexPath(forRow: numberOfRows-1, inSection: (numberOfSections-1))
                self.tableView.scrollToRowAtIndexPath(indexPath, atScrollPosition: UITableViewScrollPosition.Bottom, animated: true)
            }  
     })

【讨论】:

    【解决方案3】:

    如果您正在创建 IM 应用程序。我建议你reversetableView

    所以第一行出现在底部,不再需要在开始时滚动。

    这里有一个 cocoapod 可以提供帮助:https://github.com/marty-suzuki/ReverseExtension


    如果您仍想滚动到特定行

    实现UIScrollViewDelegate.scrollViewDidEndScrollingAnimation

    然后就是这样。

    func scrollViewDidEndScrollingAnimation(_ scrollView: UIScrollView) {
        if scrollView.contentSize.height > lastContentHeight {
            self.tableView.scrollToBottom()
            self.lastContentHeight = scrollView.contentSize.height
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-31
      • 1970-01-01
      相关资源
      最近更新 更多