在tableview和性能中滚动到底

时间:2016-07-14 20:09:13

标签: ios swift uitableview

我需要滚动到底部。我有一个像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警告。

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

3 个答案:

答案 0 :(得分:0)

如果你有分页,你可以尝试只加载当前页面和最后一页,假设每页有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)
}

}

答案 1 :(得分:0)

尝试这种方法:

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)
            }  
     })

答案 2 :(得分:0)

如果您正在创建IM应用程序。我建议您反向 Map

因此,第一行显示在底部,不需要再从头开始滚动。

这里有一个小伙伴可以帮助您:https://github.com/marty-suzuki/ReverseExtension


如果您仍然想滚动到特定行

实现Iterable

像这样

tableView