使用动态单元格高度时,如何将表格视图滚动到底部?
由于某些原因,此代码在此方案中不起作用:
[self.tableView scrollRectToVisible:CGRectMake(0, self.tableView.contentSize.height - self.tableView.bounds.size.height, self.tableView.bounds.size.width, self.tableView.bounds.size.height) animated:YES];
谢谢!
编辑:使用@ Hasiya的代码滚动到底部,对于一些人来说可能就是这样做的。
答案 0 :(得分:8)
以下内容适用于我的Swift 3.1代码,使用Xcode 8.3.2仅针对iPhone的iOS 10.1。
我和OP有同样的问题。我的应用程序包括消息功能。当消息视图被推入堆栈时,我希望最后一个帖子可见。由于消息的内容,我的tableview单元格高度是可变的。没有一个解决方案令我满意(最后一个tableview行不可见或只是部分可见)。但是,这对我有用:
在ViewController中,在'viewDidLoad'函数中实现tableview,设置tableview的'rowHeight'属性,如下所示:
myTableView.rowHeight = UITableViewAutomaticDimension
同样在'viewDidLoad'函数中,将tableview的'estimatedRowHeight'设置为高于您预期的平均行高的值。在我的情况下140。
最后也是最重要的是我写了这段代码:
extension UITableView {
func scrollToBottom() {
let rows = self.numberOfRows(inSection: 0)
let indexPath = IndexPath(row: rows - 1, section: 0)
self.scrollToRow(at: indexPath, at: .top, animated: true)
}
}
注意at: .top
- 这就解决了我的问题。传递.bottom
参数的UITableViewScrollPosition
值不起作用。即使通过.middle
工作 - 但不是.bottom
。
因此,每当我的数据集需要更新或新消息到达时,我都会调用
func getTableViewData(){
// Get your data here any way you usually do..
// call to reload
myTableView.reloadData()
// call the scroll function
myTableView.scrollToBottom()
}
我只需将at: .bottom
参数更改为at: .top
即可测试此“方法”的结果。每当我将其更改为at: .top
时,最后一行表格完全可见,表格一直滚动到底部。
答案 1 :(得分:4)
最终,我找到了答案。滚动到底部的原因不起作用(插入/删除行也有问题,正如我后面发现的那样),因为单元格高度为not properly estimated
。要解决此问题,请尝试在estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath
中返回近似估算值。但是,如果你不能这样做(并且在大多数情况下你无法做到),那么仍然有一个很好的解决方案:将单元格的高度存储在字典中,然后返回{{{重复使用单元格时(例如滚动表格视图)。我在另一个问题中找到了这个解决方案,所以请去查看实际代码,了解如何实现这一目标。 (虽然可能,你们中的许多人都可以为自己写这个)
编辑:也许修复只是滚动到底部这是不必要的,但在我看来强烈推荐。如果你不使用它来估计你的行高,你会遇到其他问题,例如错误的滚动和大量单元格的性能下降。
您还需要将其添加到estimatedHeight
viewDidAppear
答案 2 :(得分:1)
希望这对你有用。试试这个
[self.tableview setContentOffset:CGPointMake(0, CGFLOAT_MAX)]
或者
if (self.tableview.contentSize.height > self.tableview.frame.size.height)
{
CGPoint offset = CGPointMake(0, self.tableview.contentSize.height - self.tableview.frame.size.height);
[self.tableview setContentOffset:offset animated:YES];
}
答案 3 :(得分:0)
尝试使用scrollToRowAtIndexPath,如下面的代码所示。
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
NSInteger no = array.count-1;
NSIndexPath *lastIndex = [NSIndexPath indexPathForRow:no inSection:0];
[self.tableView scrollToRowAtIndexPath:lastIndex atScrollPosition:UITableViewScrollPositionBottom animated:YES];
}
答案 4 :(得分:0)
我通过这个简单的步骤来实现它:
在IB中,1)手动将估计高度设置为高于预期的值 2)在viewWillAppear中滚动到最后一行,ScrollPosition参数为UITableViewScrollPositionTop