将tableView 滚动到 footerView可见

2019-11-03  本文已影响0人  wustzhy

场景

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

一般方法

[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

上一篇下一篇

猜你喜欢

热点阅读