从底部加载tableview,向上滚动(反向tableview)(iOS)

Posted

技术标签:

【中文标题】从底部加载tableview,向上滚动(反向tableview)(iOS)【英文标题】:Load tableview from bottom, scroll up (reverse tableview) (iOS) 【发布时间】:2017-04-18 19:44:18 【问题描述】:

我想向后加载我的表格视图,这意味着表格视图从底部加载并向上滚动以查看更多内容。

首先,我尝试反转 dataSource 数组。内容被颠倒了,但它仍然从顶部加载,用户必须向下滚动才能看到更多内容。

然后我尝试在 viewWillAppear 中从底部加载 tableView:

override func viewWillAppear(_ animated: Bool) 
    super.viewWillAppear(animated)
    if (self.conversationTableView.contentSize.height > self.conversationTableView.frame.size.height) 
        let offset = CGPoint(x: CGFloat(0), y: CGFloat(self.conversationTableView.contentSize.height - self.conversationTableView.frame.size.height))
        self.conversationTableView.setContentOffset(offset, animated: true)
    

但是这种尝试不起作用,因为我正在异步下载图像(我使用的是 NSTextAttachment,它会在每个单元格中填充我的 UITextView)。每次将我的占位符替换为实际下载的图像时,都会导致 tableView 内容偏移量发生偏移(占位符的图像高度几乎总是小于下载图像的高度)。所以这样设置 contentOffset 是行不通的。

如何从底部加载 tableView 并向上滚动以查看更多内容?

【问题讨论】:

“从底部加载”是什么意思?你想建立一个表格从底部上升的动画吗? 没有。当表格加载时,我希望 Y 偏移量已经在底部。然后用户向上滚动以查看更多内容 您想要反向表格视图之类的东西,对吗?你可以查看这个extension。 【参考方案1】:

最好的方法是翻转 tableView 和它的单元格。这样,如果一个单元格要改变大小(由于异步下载之类的原因),您仍然会从 tableview 的底部加载而不是在偏移处加载。

//In ViewDidLoad
conversationTableView.transform = CGAffineTransform(rotationAngle: -(CGFloat)(Double.pi));

//In cellForRowAtIndexPath
cell.transform = CGAffineTransform(rotationAngle: CGFloat(Double.pi));

另外:如果你有 headerView,只需将其设置为tableView.tableFooterView

var tableHeaderView = UIView(frame: headerFrame)
tableHeaderView.transform = CGAffineTransform(rotationAngle: CGFloat(Double.pi));
conversationTableView.tableFooterView = tableHeaderView

如果你有footerView和headerView,只需将header设置为footer,将footer设置为header即可。

编辑: 如果你想翻转滚动指示器:

conversationTableView.scrollIndicatorInsets = UIEdgeInsetsMake(0.0, 0.0, 0.0, conversationTableView.bounds.size.width - 8.0)

【讨论】:

智能和创造性的解决方案!对我来说真的很好。我注意到的一件事是滚动条现在将出现在屏幕的左侧而不是右侧。为了解决这个问题,我调整了conversationTableView.scrollIndicatorInsets。也许值得将此添加到答案中?即 conversationTableView.scrollIndicatorInsets = UIEdgeInsetsMake(0.0, 0.0, 0.0, conversationTableView.bounds.size.width - 8.0) 知道如何让 scrollsToTop 行为在转换中正常工作吗?就像现在一样,点击状态栏会导致视图向下滚动,而不是向上滚动,这是非常规且违反直觉的。 只滚动到底部而不是顶部 只是疯狂的苹果没有本地方法来做到这一点。 旋转时,它会动画。如何在旋转时停止动画@JoshO'Connor【参考方案2】:

在您的 viewWillAppear 方法中,执行以下操作:

tableView.scrollToRowAtIndexPath(bottomIndexPath, atScrollPosition: .Bottom,
      animated: true)

bottomIndexPath 是表格视图中最后一行的 indexPath。如果您有一个长度为n 的数组并且在您的表格中只有一个部分,这通常是IndexPath(item: n-1, section: 0),但请务必检查您的具体UITableView

这将确保您从 tableView 的底部开始。完成后,您需要做的就是确保 UITableViewDataSource 上的 cellForRowAtIndexPath 方法反向返回数据,您将获得所需的效果。

【讨论】:

如果我没有异步下载图像并将它们放入我的 textView(填充单元格)中,则此方法有效。但是,由于我正在下载图像,因此在调用 scrollToRow 方法后,单元格的高度会发生变化。 图片下载完成后是否会收到某种回调?发生这种情况时,您可以滚动到表格底部/当前行的底部而没有动画。 是的,但每次下载图像时更改偏移量并不是解决此问题的最有效方法。如果您好奇,我刚刚发布了我的解决方案。感谢您的帮助

以上是关于从底部加载tableview,向上滚动(反向tableview)(iOS)的主要内容,如果未能解决你的问题,请参考以下文章

在按 Tab 键时,由于固定的底部页脚,页面不会向上滚动

当键盘出现iOS时向上滚动tableview行

从底部开始然后向上滚动

每次我重新加载 tableview 部分时 UITableView 都不会向上滚动

关闭操作表时,ios tableview不会向上滚动

Facebook 和键盘动画管理