- 首先用到了两个第三方类库
SDPieProgressView、SDBaseProgressView,这个可以直接在网上下载第三方类库 - 创建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];
}
}