UITableView 实现平滑下拉加载历史记录
记录在项目中遇到的一个坑,在IM聊天的页面中需要一个下拉加载历史聊天记录的控件。
传统下拉刷新控件
本以为用MJRefresh就好了,但是却有以下一个致命的问题:下拉加载更多内容会强制跳动到TableView的顶部。然而网上找到的只是比较应付式的解决办法,效果并不好。

平滑下拉加载刷新控件
解决思路
解决办法其实也不复杂,清楚TableView加载前后的流程就可以了,当数据增多后执行[UITableView reloadData]方法后TableView改变的有:
- ContentSize,- ContentSize会被里面的Cell撑开。
- ContentOffset会变成- {0, 0}。
因此我们要记录刷新前后的ContentSize,便可计算出需要停留的ContentOffset,那就可以实现平滑下拉加载的刷新控件了。
注意事项
不要忘了TableView的ContentInset咯。
具体实现
#import <UIKit/UIKit.h>
@interface SmoothTableView : UITableView
- (void)reloadDataWithoutScrollToTop;
@end
#import "SmoothTableView.h"
@interface SmoothTableView ()
@property (nonatomic, assign) CGPoint contentOffsetForRestore;
@end
@implementation SmoothTableView
#pragma mark - Public method
- (void)reloadDataWithoutScrollToTop {
    [self reloadData];
    [self setContentOffset:self.contentOffsetForRestore];
}
#pragma mark - Property method
- (void)setContentSize:(CGSize)contentSize {
    CGFloat previousContentHeight = self.contentSize.height;
    [super setContentSize:contentSize];
    CGFloat currentContentHeight = self.contentSize.height;
    self.contentOffsetForRestore = CGPointMake(0, (currentContentHeight - previousContentHeight - self.contentInset.top));
}
@end
最终效果如下图:
