使用动态单元格高度时,将表格视图滚动到底部

时间:2016-06-27 01:17:19

标签: ios objective-c xcode uitableview

使用动态单元格高度时,如何将表格视图滚动到底部?

由于某些原因,此代码在此方案中不起作用:

[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的代码滚动到底部,对于一些人来说可能就是这样做的。

5 个答案:

答案 0 :(得分:8)

以下内容适用于我的Swift 3.1代码,使用Xcode 8.3.2仅针对iPhone的iOS 10.1。

我和OP有同样的问题。我的应用程序包括消息功能。当消息视图被推入堆栈时,我希望最后一个帖子可见。由于消息的内容,我的tableview单元格高度是可变的。没有一个解决方案令我满意(最后一个tableview行不可见或只是部分可见)。但是,这对我有用:

  • 在界面生成器(IB)中,将单元格行高设置为大于我预期的值,我的平均行高在我的情况下为50(确保选中“自定义”复选框)。
  • 在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中返回近似估算值。但是,如果你不能这样做(并且在大多数情况下你无法做到),那么仍然有一个很好的解决方案:将单元格的高度存储在字典中,然后返回{{{重复使用单元格时(例如滚动表格视图)。我在另一个问题中找到了这个解决方案,所以请去查看实际代码,了解如何实现这一目标。 (虽然可能,你们中的许多人都可以为自己写这个)

Original solution by @dosdos

编辑:也许修复只是滚动到底部这是不必要的,但在我看来强烈推荐。如果你不使用它来估计你的行高,你会遇到其他问题,例如错误的滚动和大量单元格的性能下降。

您还需要将其添加到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