iOS开发文档iOS开发

iOS tableView在出现时自动滚动到底部(不闪动,无痕)

2018-10-15  本文已影响1462人  TigerManBoy

在做关于聊天等一些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框的时候,就会有明显的闪动效果,所以可以根据实际情况来使用。

上一篇下一篇

猜你喜欢

热点阅读