手写下拉刷新

     虽然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;

/**
 *  “
松手刷新 ...”
 */
@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 ;
    }
}
有些下拉刷新框架是需要在调用的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 ];
            });
        });
    }
}
这里是刷新完成之后再将这个View收起来,那么我们就要设置scrollView的contentInset属性,当数据加载完成的时候再将其设置初始值即可。 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值