以下是我使用的代码:
//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滚动到底部?
答案 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,你可以用它来做魔术。否则你可能会发现我的技巧解决方案表现更好。
无论如何,谢谢你的所有答案。