如何正确插入底部的行后滚动tableview?

时间:2013-11-13 23:10:36

标签: ios uitableview uiscrollview livechat

以下是我使用的代码:

//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的原因。我尝试使用带有标签的scrollView,它工作正常,但tableView在聊天视图中似乎更受欢迎。

我正在考虑使用scrollView或tableView,我发现Apple的内置消息应用程序正在使用tableView,所以我采用了tableView。如果带有Label的scrollView比tableView更好,请告诉我。

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

2 个答案:

答案 0 :(得分:8)

尝试使用UITableView's scrollToRowAtIndexPath:

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

答案 1 :(得分: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之后重新加载数据。这可确保在插入新行后更新tableView contentSize。然后检查滚动距离是否大于contentInset.top(这是为了避免将tableview隐藏在状态栏和导航栏后面)然后向下滚动,否则不要因为一些奇怪的动画而滚动。

或者,你可以简单地使用

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

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

无论如何,谢谢你的所有答案。