虽然iOS8之后在tableViewController中加上了headerControl,但是只能继承tableViewController的时候使用,当tableView是UIViewController其中一个控件的时候就没有整个功能了,所以自己手写下拉刷新还是有必有的。之前自己写了一遍,之后在写的时候还是会有很对地方忘记,所以现在记录一下:
首先是定义一些状态和对外暴露的方法:
/**
* 下拉状态
*/
typedef NS_ENUM (NSInteger, RefreshState){
/**
* 下拉
*/
REFRESH_SATE_PULLING = 1 ,
/**
* 加载
*/
REFRESH_SATE_LOADING = 2 ,
/**
* 正常
*/
REFRESH_SATE_NOMAL = 3
};
typedef void (^freshBlock)();
@interface RefreshTableHeaderView : UIView < UIScrollViewDelegate >
@property ( nonatomic , assign ) RefreshState state;
@property ( nonatomic , strong ) UIScrollView *scrollView;
@property ( nonatomic , copy ) freshBlock block;
* 下拉状态
*/
typedef NS_ENUM (NSInteger, RefreshState){
/**
* 下拉
*/
REFRESH_SATE_PULLING = 1 ,
/**
* 加载
*/
REFRESH_SATE_LOADING = 2 ,
/**
* 正常
*/
REFRESH_SATE_NOMAL = 3
};
typedef void (^freshBlock)();
@interface RefreshTableHeaderView : UIView < UIScrollViewDelegate >
@property ( nonatomic , assign ) RefreshState state;
@property ( nonatomic , strong ) UIScrollView *scrollView;
@property ( nonatomic , copy ) freshBlock block;
/**
* “ 松手刷新 ...”
*/
* “ 松手刷新 ...”
*/
@property
(
nonatomic
,
strong
)
UILabel
*stateLabel;
- (
void
)addRefreshViewToTableView:(
UITableView
*)tableView;
- (void) refreshViewWithBlock:(freshBlock)block;
因为stateLabel的的文字信息是和state的值相对应的,那么我索性将text属性的赋值就直接写在state的set方法里面了,代码如下:
- (
void
) setState:(
RefreshState
)state
{
_state = state;
switch (state) {
case REFRESH_SATE_NOMAL :
{
self . stateLabel . text = @" 下拉刷新 ..." ;
}
break ;
case REFRESH_SATE_LOADING :
{
self . stateLabel . text = @" 正在刷新 ..." ;
}
break ;
case REFRESH_SATE_PULLING :
{
self . stateLabel . text = @" 释放后刷新 ..." ;
}
default :
break ;
}
{
_state = state;
switch (state) {
case REFRESH_SATE_NOMAL :
{
self . stateLabel . text = @" 下拉刷新 ..." ;
}
break ;
case REFRESH_SATE_LOADING :
{
self . stateLabel . text = @" 正在刷新 ..." ;
}
break ;
case REFRESH_SATE_PULLING :
{
self . stateLabel . text = @" 释放后刷新 ..." ;
}
default :
break ;
}
}
有些下拉刷新框架是需要在调用的Controller中实现scrollViewDelegate,那么我就想直接把scrollView传进来,在这个类里面实现。刷新时需要调用的代码用block的形式传递进来。
#pragma mark ====scrollViewDelegate===
- ( void )scrollViewDidScroll:( UIScrollView *)scrollView
{
if (scrollView. contentOffset . y < - 80 && self . state == REFRESH_SATE_NOMAL ){
self . state = REFRESH_SATE_PULLING ;
[[ WaitDialog shareWaitDialog ] startLoading ];
[ self . activityView startAnimating ];
}
}
- ( void )scrollViewDidEndDragging:( UIScrollView *)scrollView willDecelerate:( BOOL )decelerate
{
if ( self . state == REFRESH_SATE_PULLING ) {
self . state = REFRESH_SATE_LOADING ;
self . scrollView . contentInset = UIEdgeInsetsMake ( 80 , 0 , 0 , 0 );
dispatch_queue_t queue = dispatch_get_global_queue ( DISPATCH_QUEUE_PRIORITY_DEFAULT , 0 );
__weak typeof ( self ) weakSelf = self ;
dispatch_async (queue, ^{
__strong typeof (weakSelf) strongSelf = weakSelf;
NSMutableArray *array = [ NSMutableArray array ];
for ( int i = 0 ; i< 15 ; i++) {
NSURL *url=[ NSURL URLWithString : @"http://wenwen.sogou.com/p/20110923/20110923201826-1347223277.jpg" ];
UIImage *image = [ UIImage imageWithData :[ NSData dataWithContentsOfURL :url]];
[array addObject :image];
}
strongSelf. block ();
dispatch_async ( dispatch_get_main_queue (), ^{
self . scrollView . contentInset = UIEdgeInsetsMake ( 0 , 0 , 0 , 0 );
self . state = REFRESH_SATE_NOMAL ;
[[ WaitDialog shareWaitDialog ] endLoading ];
[[ WaitDialog shareWaitDialog ] showFinishDialogWithMsg : @" 完成 " ];
[ self . activityView stopAnimating ];
});
});
}
- ( void )scrollViewDidScroll:( UIScrollView *)scrollView
{
if (scrollView. contentOffset . y < - 80 && self . state == REFRESH_SATE_NOMAL ){
self . state = REFRESH_SATE_PULLING ;
[[ WaitDialog shareWaitDialog ] startLoading ];
[ self . activityView startAnimating ];
}
}
- ( void )scrollViewDidEndDragging:( UIScrollView *)scrollView willDecelerate:( BOOL )decelerate
{
if ( self . state == REFRESH_SATE_PULLING ) {
self . state = REFRESH_SATE_LOADING ;
self . scrollView . contentInset = UIEdgeInsetsMake ( 80 , 0 , 0 , 0 );
dispatch_queue_t queue = dispatch_get_global_queue ( DISPATCH_QUEUE_PRIORITY_DEFAULT , 0 );
__weak typeof ( self ) weakSelf = self ;
dispatch_async (queue, ^{
__strong typeof (weakSelf) strongSelf = weakSelf;
NSMutableArray *array = [ NSMutableArray array ];
for ( int i = 0 ; i< 15 ; i++) {
NSURL *url=[ NSURL URLWithString : @"http://wenwen.sogou.com/p/20110923/20110923201826-1347223277.jpg" ];
UIImage *image = [ UIImage imageWithData :[ NSData dataWithContentsOfURL :url]];
[array addObject :image];
}
strongSelf. block ();
dispatch_async ( dispatch_get_main_queue (), ^{
self . scrollView . contentInset = UIEdgeInsetsMake ( 0 , 0 , 0 , 0 );
self . state = REFRESH_SATE_NOMAL ;
[[ WaitDialog shareWaitDialog ] endLoading ];
[[ WaitDialog shareWaitDialog ] showFinishDialogWithMsg : @" 完成 " ];
[ self . activityView stopAnimating ];
});
});
}
}
这里是刷新完成之后再将这个View收起来,那么我们就要设置scrollView的contentInset属性,当数据加载完成的时候再将其设置初始值即可。