美文网首页
将tableView 滚动到 footerView可见

将tableView 滚动到 footerView可见

作者: wustzhy | 来源:发表于2019-11-03 11:35 被阅读0次

    场景

    点击按钮滑到底部评论列表出现

    一般方法

    [self.tableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:
                                                        [self.tableView numberOfRowsInSection:0]-1 inSection:0]
                                      atScrollPosition:UITableViewScrollPositionTop animated:YES];
           
    

    特殊情况

    但是当cell使用autoLayout后并设为UITableViewAutomaticDimension自动计算size,将无法一次获取最终的contentSize,随着滑动cell越来越多出现并自动计算,直到最后一个cell计算完,才有最终的contenSize出现。
    直接使用上面的方法,导致无法准确将tableView 滚动到 footerView出现,于是

    - (void)scrollToComment {
    
        NSUInteger num = [self.tableView numberOfRowsInSection:0];
        if (num > 0) {
            
            CGRect footerRect = [self.tableView convertRect:self.tableView.tableFooterView.frame fromView:self.tableView];
            if (footerRect.origin.y + footerRect.size.height < self.tableView.bounds.size.height) {
                return ;
            }
            
            [UIView animateWithDuration:0.25 animations:^{
                [self.tableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:
                                                        [self.tableView numberOfRowsInSection:0]-1 inSection:0]
                                      atScrollPosition:UITableViewScrollPositionTop animated:NO];
            } completion:^(BOOL finished) {
                if (CGRectGetMinY(self.tableView.tableFooterView.frame) > self.tableView.bounds.size.height + self.tableView.contentOffset.y) {
                    
                    CGRect footerRect = [self.tableView convertRect:self.tableView.tableFooterView.frame fromView:self.tableView];
                    dispatch_async(dispatch_get_main_queue(), ^{
                        CGPoint newContentOffset = CGPointMake(0, footerRect.origin.y - self.tableView.bounds.size.height + 25);
                        if (newContentOffset.y + self.tableView.bounds.size.height > self.tableView.contentSize.height) {
                            newContentOffset.y = self.tableView.contentSize.height - self.tableView.bounds.size.height;
                        }
                        [self.tableView setContentOffset:newContentOffset animated:YES];
                    });
                }
            }];
            
        }
    }
    

    思路:
    先滚一次到最后的cell,然后再滚一次到footView,哈哈,perfect

    相关文章

      网友评论

          本文标题:将tableView 滚动到 footerView可见

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