在表格视图和性能中滚动底部

Posted

技术标签:

【中文标题】在表格视图和性能中滚动底部【英文标题】: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 警告。

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

【问题讨论】:

您找到解决方案了吗?也使用领域。 【参考方案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
    

【讨论】:

以上是关于在表格视图和性能中滚动底部的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Swift 中向上滚动整个表格视图?

表格视图仅滚动到文本字段底部边缘

在可见视图中显示表格视图的底部

如何在 UITableView swift 3 中使用动画在底部滚动

在 MVC 5 应用程序中检测滚动到局部视图的底部

如何修复滚动视图 android 底部的按钮?