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
最终效果如下图: