美文网首页iOS开发文档iOS开发
iOS tableView在出现时自动滚动到底部(不闪动,无痕)

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

作者: TigerManBoy | 来源:发表于2018-10-15 18:03 被阅读1462次

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

    相关文章

      网友评论

        本文标题:iOS tableView在出现时自动滚动到底部(不闪动,无痕)

        本文链接:https://www.haomeiwen.com/subject/pzgfzftx.html