将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