在做关于聊天等一些app的时候,会有进入聊天页面时,需要将UITableView滑动到底部的操作,即显示最新的消息,有以下几种方法:
1、在viewDidAppear中设置tableView的contentOffSet
[self.tableView setContentOffset:CGSizeMake(0, self.tableView.contentSize.height - self.tableView.frame.size.height) animated:YES];
2、在viewDidAppear中设置滑动到底部
NSIndexPath *indexpath = [NSIndexPath indexPathForRow:self.chatData.count-1 inSection:0];
[self.tableView scrollToRowAtIndexPath:indexpath atScrollPosition:UITableViewScrollPositionBottom animated:NO];
上面这两种方法都可以实现滑动到底部,但是如果animated设置为YES,则会出现滚动现象,如果animated设置为NO,则会出现闪动现象,都会影响用户的体验,因此不推荐这两种方法
3、在TableView的numberOfRowsInSection方法中设置contentOffSet(推荐方法)
tableView在执行numberOfRowsInSection的代理的时候,已经确定了tableView的Contentsize,因此可以设置tableView的contentOffSet来实现滑动到底部。
但是要注意的是,只有在初始化的时候执行,之后再收到消息或者刷新tableView的时候,不再执行
if (self.isScrollBottom) { //只在初始化的时候执行
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.005 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
if (self.chatData.count > 0) {
NSIndexPath *indexPath = [NSIndexPath indexPathForRow:([self.tableView numberOfRowsInSection:0]-1) inSection:0];
[self.tableView scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionBottom animated:NO];
});
}
- (void)viewDidAppear {
self.scrollBottom = NO;
}
这种方法要加一个延时,不然会造成死循环。
在viewDidAppear中将属性改为NO
4、在网络请求结束的时候,滑动到底部 (推荐)
// 滚动到最底部
-(void)scrollToBottom {
if (self.chatData.count > 0) {
if ([self.tableView numberOfRowsInSection:0] > 0) {
NSIndexPath *indexPath = [NSIndexPath indexPathForRow:([self.tableView numberOfRowsInSection:0]-1) inSection:0];
[self.tableView scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionBottom animated:NO];
}
}
}
这种方法在有loading框的时候,可以使用,但是在没有loading框的时候,就会有明显的闪动效果,所以可以根据实际情况来使用。
网友评论