如何通过平滑滚动将最后一行添加到 UITableView?

Posted

技术标签:

【中文标题】如何通过平滑滚动将最后一行添加到 UITableView?【英文标题】:How to add last row to UITableView with smooth scrolling? 【发布时间】:2016-07-11 10:09:09 【问题描述】:

我正在使用 UITableView 构建聊天界面。我正在使用下面的代码添加单元格

self.tableView.beginUpdates()
self.tableView.insertRows(at: [IndexPath(row: self.messageCards.count - 1, section: 0)], with: .bottom)
    self.tableView.endUpdates()

添加后我使用 scrollToRowAtIndexPath 来显示最后插入的行。

let indexPath = IndexPath(row: self.messageCards.count - 1, section: 0)
self.tableView.scrollToRow(at: indexPath, at: .bottom, animated: false)

但最后两个动画都在混合,滚动并不顺利。

【问题讨论】:

想要的动画序列应该是什么...... @RohitKP 首先我想向上滚动并想使用动画显示新消息 【参考方案1】:

你可以试试这个,我已经测试过代码:

    arrayData.addObject(str)
    let indexpath = NSIndexPath(forRow: arrayData.count-1, inSection: 0)

    tblView.insertRowsAtIndexPaths([indexpath], withRowAnimation: UITableViewRowAnimation.Automatic)
    tblView.scrollToRowAtIndexPath(indexpath, atScrollPosition: UITableViewScrollPosition.Bottom, animated: true)

以下是输出:如果您想要完整的源代码,请告诉我。

【讨论】:

这在添加单元格大小固定的情况下可以正常工作,当中间添加一个大单元格时,动画会混乱,整个tableview闪烁,滚动不流畅。 【参考方案2】:

请看看这个。

 [UITableView animateWithDuration:5.0 delay:0.1 options:UIViewAnimationOptionCurveEaseOut animations:^
        [self.tableView insertRowsAtIndexPaths:@[[NSIndexPath indexPathForRow:self.messageCards.count-1 inSection:0]] withRowAnimation:UITableViewRowAnimationFade];
     completion:^(BOOL finished) 
        NSLog(@"animated");
        [self.tableView scrollToRowAtIndexPath:[NSIndexPath indexPathWithIndex:self.messageCards.count-1] atScrollPosition:UITableViewScrollPositionBottom animated:YES];
    ];

【讨论】:

【参考方案3】:

很神奇,但要实现滚动时的平滑添加只需要调用reloadData()

func fetchNext(_ countToFetch: Int? = 10) 

    let existingCount = items?.count ?? 0

    networkService?.items(bySkip: existingCount, take: countToFetch, completion:  (data, error) in

        if let newItems = data?.items() as? [Element], newItems.count > 0 
            self.items?.append(contentsOf: newItems)
            self.refreshCallback?()
        
    )

回调是:

datasource?.refreshCallback =  [weak self] in

    if #available(ios 10.0, *) 
        self?.table.refreshControl?.endRefreshing()
    
    self?.table.reloadData()

【讨论】:

reloadData 在我看来会更糟,因为所有行都将被重新加载,这不是必需的。【参考方案4】:
[self.messageCards addObject:@"DATA Whatever you want"];
[self.tableView reloadData];
[self.tableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:self.messageCards.count-1 inSection:0] atScrollPosition:UITableViewScrollPositionBottom animated:YES];

【讨论】:

以上是关于如何通过平滑滚动将最后一行添加到 UITableView?的主要内容,如果未能解决你的问题,请参考以下文章

ios - 使 UIScrollView 平滑滚动

如何禁止TreeView.ExpandAll方法自动滚动到树的末尾?

C# DataGridView 数据显示到最后一行后,如何使滚动条继续向下滚动。

React useRef 将平滑滚动添加到除 Internet Explorer 之外的所有浏览器都支持的 div

如何通过平滑滚动重定向到不同页面上的特定 div

表格视图没有滚动到最后一行?