..

UITableView 实现平滑下拉加载历史记录

记录在项目中遇到的一个坑,在IM聊天的页面中需要一个下拉加载历史聊天记录的控件。

传统下拉刷新控件

本以为用MJRefresh就好了,但是却有以下一个致命的问题:下拉加载更多内容会强制跳动到TableView的顶部。然而网上找到的只是比较应付式的解决办法,效果并不好。


平滑下拉加载刷新控件

解决思路

解决办法其实也不复杂,清楚TableView加载前后的流程就可以了,当数据增多后执行[UITableView reloadData]方法后TableView改变的有:

  1. ContentSizeContentSize会被里面的Cell撑开。
  2. 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

最终效果如下图: