2017-04-18 136 views
2

我想向后加载我的tableview,这意味着tableView从底部加载并向上滚动以查看更多内容。从底部加载tableview,向上滚动(反向tableview)(iOS)

首先,我试着颠倒了dataSource数组。内容是颠倒的,但它仍然从顶部加载,用户必须向下滚动以查看更多内容。

我又试图从底部加载的tableView在viewWillAppear中:

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并向上滚动以查看更多内容?

+0

你是什么意思“从底部负荷”是什么意思?你想建立一个从底部上来的表格动画吗? –

+0

不。当表格加载时,我希望Y偏移量已经在底部。用户然后滚动查看更多内容 –

+0

你想要反转tableview的东西吗?你可以查看这个[extension](https://github.com/marty-suzuki/ReverseExtension)。 – ridvankucuk

回答

10

最好的方法是翻转tableView和它的单元格。这样,如果一个单元格的大小发生了变化(由于异步下载等原因),您仍然可以从tableview底部加载,而不是在偏移量处加载。

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

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

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

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

如果你有一个footerView和headerView,只需设置页眉页脚和页脚标题。

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

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

智能且富有创意的解决方案!对我来说真的很好。我注意到的一件事是,滚动条现在将出现在屏幕的左侧,而不是右侧。为了解决这个问题,我调整了conversationTableView.scrollIndicatorInsets。也许值得添加这个答案?即conversationTableView.scrollIndicatorInsets = UIEdgeInsetsMake(0.0,0.0,0.0,conversationTableView.bounds.size.width - 8.0) – Bocaxica

+1

更新了我的答案,谢谢:) –

1

在你viewWillAppear方法,做到以下几点:

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

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

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

+0

如果我不异步下载图像并将它们放入我的textView(它填充一个单元格),这可以工作。但是,由于我正在下载图像,因此在调用scrollToRow方法后,单元格高度会发生变化。 –

+0

当图像下载完成时,你会得到某种回调吗?您可以在没有动画的情况下滚动到当前行的表格/底部底部。 –

+1

是的,但每次下载图像时更改偏移量并不是解决此问题的最有效方法。如果您好奇,我只是发布了我的解决方案。感谢您的帮助 –

相关问题