第三方SDPieProgressView 下拉刷新tableView

  1. 首先用到了两个第三方类库
    SDPieProgressView、SDBaseProgressView,这个可以直接在网上下载第三方类库
  2. 创建tableView,初始化数据
#define kWidth self.view.frame.size.width
#define kHeight self.view.frame.size.height
#define pieHeight 60

BOOL isAnimate;//判断是否正在执行动画
@property(nonatomic,weak)SDPieProgressView * pieProgress;//扇形加载
@property(nonatomic,weak)UIImageView * imageView;//放置旋转小图片
@property(nonatomic,weak)UILabel * tintLabel;//提示信息

3.创建SDPieProgressView

    SDPieProgressView * pieProgress=[SDPieProgressView progressView];
    pieProgress.frame= CGRectMake(0, 0, kWidth, pieHeight);
    pieProgress.backgroundColor=[UIColor clearColor];
    self.pieProgress=pieProgress;
    [self.view  insertSubview:pieProgress belowSubview:self.tableView];
    isAnimate=NO;//动画初始为NO
    pieProgress.delegate=self;//实现代理

4.UIScrollViewDelegate的代理方法

- (void)scrollViewDidScroll:(UIScrollView *)scrollView{
    if (!isAnimate) {
        if (self.tableView.contentOffset.y <= -pieHeight) {  
         self.pieProgress.progress = (-self.tableView.contentOffset.y-pieHeight)/pieHeight;  
            if (self.tableView.contentOffset.y <= -2*pieHeight) { 
                if (self.imageView==nil && self.tintLabel==nil) {      
                    //动画视图
                    [self loadAnimateView];    
                    self.imageView.image=[UIImage imageNamed:@"exclusive_title_icon.png"];
                    self.tintLabel.text=@"释放刷新";
                }        
                //开启动画
                [self startAnimate];
            }
        }else{
            self.pieProgress.progress = 0;
        }
    }
}

- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate{
   if (isAnimate) {
        self.tableView.frame=CGRectMake(0, pieHeight, kWidth, kHeight);
        self.tintLabel.text=@"正在刷新";
        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{       
            [NSThread sleepForTimeInterval:5];
            isAnimate=NO;  
            dispatch_sync(dispatch_get_main_queue(), ^{
                [UIView animateWithDuration:0.5 animations:^{
                    self.tintLabel.text=@"刷新成功";
                    self.tableView.frame=CGRectMake(0, 0, kWidth, kHeight);    
                }completion:^(BOOL finished) {
                    //停止动画
                    [self stopAnimate];   
                }];
            });
        });
    }
}

5.动画开启关闭方法

#pragma mark - 开始动画
- (void)startAnimate{
    [UIView beginAnimations:@"" context:nil];
    [UIView setAnimationDuration:0.2];
    [UIView setAnimationRepeatCount:CGFLOAT_MAX];
 self.imageView.transform=CGAffineTransformRotate(self.imageView.transform, M_PI);
    [UIView commitAnimations];
}

#pragma mark - 停止动画
- (void)stopAnimate{
    [self.imageView removeFromSuperview];
    self.imageView=nil;
    [self.tintLabel removeFromSuperview];
    self.tintLabel=nil;
    self.pieProgress.hidden=NO;
    self.pieProgress.progress=0;
}

6.代理方法

1>为第三方SDBaseProgressView增加一个代理方法,消除在下拉太快时而没有刷新页面的情况
@protocol ChangeState <NSObject>
- (void) changeState;
@end
@property(nonatomic,weak) id<ChangeState> delegate;

#pragma mark - changeState代理
- (void)changeState{
    isAnimate=YES;
}
2> 需要把第三方SDBaseProgressView里面的setProgress方法修改一下
- (void)setProgress:(CGFloat)progress
{
    _progress = progress;
    if (progress >= 1.0) {
//        [self removeFromSuperview];
        //调用代理实现动画状态改变
        [self.delegate changeState];
        //隐藏当前的pie视图
        self.hidden=YES;
    } else {
        [self setNeedsDisplay];
    }    
}

下拉时的扇形变化

释放刷新数据

正在刷新页面

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值