看代码:
#import "ZKMyActivityIndicator.h"
#import <QuartzCore/QuartzCore.h>
#import "UIColor+HexColor.h"
@interface ZKMyActivityIndicator ()
{
CGContextRef _context;
NSTimer * _timer;
CGFloat _startAngle;
CGFloat _endAngle;
NSInteger _speed;
}
@end
@implementation ZKMyActivityIndicator
/*
// Only override drawRect: if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
*/
- (void)drawRect:(CGRect)rect {
// Drawing code
self.backgroundColor = [UIColor whiteColor];
if (_timer == nil) {
_speed = 1;
NSDate * fireDate = [NSDate date];
_timer = [[NSTimer alloc] initWithFireDate:fireDate interval:0.01 target:self selector:@selector(timerAction) userInfo:nil repeats:YES];
[[NSRunLoop mainRunLoop] addTimer:_timer forMode:NSDefaultRunLoopMode];
}
if (_context == nil) {
_context = UIGraphicsGetCurrentContext();
_startAngle = 90 * (M_PI/180);
_endAngle = 60 * (M_PI/180);
}
CGContextSetLineWidth(_context, 2.0);
CGContextSetStrokeColorWithColor(_context, [UIColor colorWithHexString:@"00ACED"].CGColor);
CGContextAddArc(_context, rect.origin.x + rect.size.width/2, rect.origin.y + rect.size.height/2, 45, _startAngle, _endAngle, 1);
CGContextStrokePath(_context);
}
- (void) timerAction {
//度数大了就减一圈,免得_startAngle和_endAngle一直增加,最后溢出
if (_startAngle >= 360 * (M_PI/180) || _endAngle >= 360 * (M_PI/180)) {
_startAngle -= 360 * (M_PI/180);
_endAngle -= 360 * (M_PI/180);
}
//动画开始时,起始位置速度大于尾巴速度, 我这里比较省事儿,你做的时候,可以把这两个速度定义为常量,或者通过属性传入
//开始位置快追上尾巴时,就让开始位置速度和尾巴速度互换
if ((_startAngle - _endAngle) > (330 * (M_PI/180)) || _speed == 2) {
_startAngle += 1 * (M_PI/180);
_endAngle += 2 * (M_PI/180);
_speed = 2;
}
//_speed == 1时,开始位置速度 > 尾巴速度
//_speed == 2时,开始位置速度 < 尾巴速度
//其实这个_speed就是个标志位
//尾巴快追上开始位置时,再次互换,就这样,循环
if ((_startAngle - _endAngle) < (30 * (M_PI/180)) || _speed == 1) {
_startAngle += 2 * (M_PI/180);
_endAngle += 1 * (M_PI/180);
_speed = 1;
}
//相信上面的画弧难不倒你
[self setNeedsDisplay];
}
#import "UIColor+HexColor.h"
这个头文件不是系统的,你可以不用这个设置颜色的方式。直接拷贝代码肯定运行不了