4

这是我使用的代码:

//inserting a row at the bottom first
_numberOfRecords++;
[_tableView beginUpdates];
[_tableView insertRowsAtIndexPaths:@[[NSIndexPath indexPathForRow:_numberOfRecords-1 inSection:0]] withRowAnimation:UITableViewRowAnimationBottom];
[_tableView endUpdates];
//clear text
_inputField.text = @"";

//then scroll to bottom
CGPoint bottomOffset = CGPointMake(0, _tableView.contentSize.height + 44.0 + _tableView.contentInset.top - _tableView.bounds.size.height);
NSLog(@"%f", _tableView.contentSize.height + 44.0 + _tableView.contentInset.top - _tableView.bounds.size.height);
[_tableView setContentOffset:bottomOffset animated:YES];

这将以一种非常奇怪的方式滚动 tableview。但是,如果我在插入之前放置滚动代码,它可以正常工作,只是它忽略了最新插入的行。也就是说,它滚动到倒数第二行,而不是滚动到最后一行(当然,因为它在插入新卷之前滚动。)

所以我相信这段代码应该滚动到的位置没有问题。问题可能来自对 tableview 的行插入。它违反了滚动表格视图的动画。

我这样做是为了制作聊天视图。每次用户发送或接收消息时,我都会在表格视图中插入一行包含该消息的行,并将其滚动到底部。这就是我在这里使用 tableView 的原因。我尝试使用带有标签的滚动视图,它工作正常,但 tableView 在聊天视图中似乎更受欢迎。

本来想用scrollView或者tableView,发现苹果内置的消息app用的是tableView,所以采用tableView。让我知道带有标签的滚动视图是否比表格视图更好。

无论如何,插入新行后如何将 tableView 滚动到底部?

4

2 回答 2

8

尝试使用UITableView's scrollToRowAtIndexPath:

[self.tableView scrollToRowAtIndexPath: atScrollPosition: animated:];
于 2013-11-13T23:31:16.843 回答
1

这是我自己的解决方案:

[_tableView reloadData];

    //scroll to bottom
double y = _tableView.contentSize.height - _tableView.bounds.size.height;
CGPoint bottomOffset = CGPointMake(0, y);
NSLog(@"after = %f", y);
if (y > -_tableView.contentInset.top)
    [_tableView setContentOffset:bottomOffset animated:YES];

在 endUpdates 之后首先 reloadData。这可确保在插入新行后更新 tableView contentSize。然后检查滚动距离是否大于contentInset.top(这是为了避免tableview隐藏在状态栏和导航栏后面)然后向下滚动,否则因为一些奇怪的动画而不滚动。

或者,您可以简单地使用

[self.tableView scrollToRowAtIndexPath: inSection: atScrollPosition: animated:];

滚动到您想要的行。但这并不能很好地处理带有节和页脚的单元格。对于普通的 tableViewCell,你可以用它来做魔术。否则你可能会发现我的技巧解决方案表现更好。

无论如何,感谢您的所有回答。

于 2013-11-13T23:47:53.633 回答