參考文檔
原文作者數(shù)學(xué)功底相當(dāng)牛逼,他用一張圖片簡(jiǎn)單實(shí)現(xiàn)進(jìn)度條效果非常不錯(cuò),這里簡(jiǎn)單嘗試的封裝一下,當(dāng)然很簡(jiǎn)陋。
示例效果
QQ20160924-1.png
簡(jiǎn)單使用
LoadingWave *loadingWave = [[LoadingWave alloc]initWithFrame:CGRectMake(0, 0, 200 , 200)];
[self.view addSubview:loadingWave];
loadingWave.center = self.view.center;
self.loadingWave = loadingWave;
//通過計(jì)時(shí)器改變其progress
self.progress += 0.1;
[self.loadingWave setProgress:self.progress];
if (self.progress > 1.0 ) {
[self.timer invalidate];
self.timer = nil;
return;
}
封裝方法
.h 文件
@interface LoadingWave : UIView
- (instancetype)initWithFrame:(CGRect)frame;
- (void)setProgress:(CGFloat)progress;
- (void)hiddenLoadingWave;
@end
.m 文件
#import "LoadingWave.h"
#import "UIView+Frame.h"
@interface LoadingWave ()
@property (nonatomic,retain) UIImageView *rotationImageView;
@property (nonatomic,retain) UIImageView *waveImageView;
@end
@implementation LoadingWave
- (instancetype)initWithFrame:(CGRect)frame {
self = [super initWithFrame:frame];
if (self) {
self.frame = frame;
//旋轉(zhuǎn)視圖
UIImageView *rotationImageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"rotation"]];
rotationImageView.frame = CGRectMake(0, 0, frame.size.width, frame.size.width);
[self addSubview:rotationImageView];
//波浪視圖
//這邊關(guān)于bgView的frame設(shè)置看似很麻煩,其實(shí)是在frame為200時(shí),外圓內(nèi)圓半徑相差18,
//所以這邊需要計(jì)算在frame不同時(shí),frame與內(nèi)圓一致。
UIView *bgView = [[UIView alloc]initWithFrame:CGRectMake(18 * frame.size.width/200, 18*frame.size.width/200, frame.size.width- 18 * frame.size.width/200 *2 , frame.size.width- 18 * frame.size.width/200 *2 )];
bgView.layer.cornerRadius = bgView.frame.size.width/2;
//視圖的子視圖超出視圖部分截掉
bgView.clipsToBounds = YES;
[self addSubview:bgView];
UIImageView *waveImageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"wave"]];
waveImageView.frame = CGRectMake(0, 0, 750, 300);
waveImageView.top = bgView.frame.size.height;
waveImageView.left = - 750;
[bgView addSubview:waveImageView];
self.waveImageView = waveImageView;
self.rotationImageView = rotationImageView;
}
return self;
}
- (void)setProgress:(CGFloat )progress{
[UIView animateWithDuration:2
animations:^{
//這里最奇怪???
//當(dāng)旋轉(zhuǎn)角度是180度是永遠(yuǎn)只順時(shí)針旋轉(zhuǎn)。但除2后回歸正常
_rotationImageView.transform = CGAffineTransformRotate(_rotationImageView.transform, (-M_PI/1.9));
//_rotationImageView.layer.transform = CATransform3DRotate(_rotationImageView.layer.transform, M_PI, 0, 0, 1);
_waveImageView.top = self.frame.size.height * (1- progress) - 20;
NSLog(@"%f",progress);
if (progress >= 1.0) {
_waveImageView.top = -20;
return ;
}
_waveImageView.left = -(750 - progress * 750);
}];
}
- (void)hiddenLoadingWave{
self.hidden = YES;
[self removeFromSuperview];
}