我有一个进度条,我使用重复计时器对其进行动画处理。它工作得很好,只是动画不如使用核心动画那么流畅。如果有人对如何使用核心动画实现它有任何建议,我将不胜感激!将核心动画用于更简单的东西我没有问题,但是动画渐变等让我感到难过。
我的代码在这里 -
-(id)initWithWidth:(float)theWidth radius:(float)theRadius progress:(float)theProgress
{
self = [super initWithFrame:CGRectMake(0, 0, theWidth, theRadius * 2)];
if (self) {
_progressBarWidth = theWidth;
_radius = theRadius;
_progress = (float)theProgress;
self.backgroundColor = [UIColor clearColor];
}
return self;
}
-(void)setProgress:(float)theProgress
{
_progress = theProgress;
[self setNeedsDisplay];
}
-(void)drawRect:(CGRect)rect
{
// gradient for blue background (pale blue -> dark blue)
float colours[] = {0.0, 135.0 / 255.0, 237.0 / 255.0, 1.0, 1.0 / 255.0, 24.0 / 255.0, 140.0 / 255.0, 1.0};
CGColorSpaceRef baseSpace = CGColorSpaceCreateDeviceRGB();
size_t num_locations = 2;
CGFloat locations[2] = {0.0, 1.0};
CGGradientRef gradient = CGGradientCreateWithColorComponents(baseSpace, colours, locations, num_locations);
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSaveGState(context);
CGContextMoveToPoint(context, _radius, 0.0);
CGContextAddArcToPoint(context, _progressBarWidth, 0.0, _progressBarWidth, _radius, _radius);
CGContextAddArcToPoint(context, _progressBarWidth, 2.0 * _radius, _progressBarWidth - _radius, 2.0 * _radius, _radius);
CGContextAddArcToPoint(context, 0.0, 2.0 * _radius, 0.0, _radius, _radius);
CGContextAddArcToPoint(context, 0.0, 0.0, _radius, 0.0, _radius);
CGContextClosePath(context);
CGContextClip(context);
CGPoint startPoint = CGPointMake(_progressBarWidth / 2.0, 0.0);
CGPoint endPoint = CGPointMake(_progressBarWidth / 2.0, 2.0 * _radius);
CGContextDrawLinearGradient(context, gradient, startPoint, endPoint, 0);
CGGradientRelease(gradient);
CGColorSpaceRelease(baseSpace);
CGContextRestoreGState(context);
// gradient for progressed element (pale yellow -> dark yellow)
float colours2[] = {252.0 / 255.0, 224.0 / 255.0, 0.0, 1.0, 246.0 / 255.0, 191.0 / 255.0, 0.0, 1.0};
baseSpace = CGColorSpaceCreateDeviceRGB();
gradient = CGGradientCreateWithColorComponents(baseSpace, colours2, locations, num_locations);
context = UIGraphicsGetCurrentContext();
CGContextSaveGState(context);
// this defines an overall clipping path for the yellow bar (it's got a square end which can protrude when it's near 100%)
CGContextMoveToPoint(context, _radius, kDefaultLineWidth);
CGContextAddArcToPoint(context, _progressBarWidth - kDefaultLineWidth, kDefaultLineWidth, _progressBarWidth - kDefaultLineWidth, _radius, _radius - kDefaultLineWidth);
CGContextAddArcToPoint(context, _progressBarWidth - kDefaultLineWidth, 2.0 * _radius - kDefaultLineWidth, _progressBarWidth - _radius, 2.0 * _radius - kDefaultLineWidth, _radius - kDefaultLineWidth);
CGContextAddArcToPoint(context, kDefaultLineWidth, 2.0 * _radius - kDefaultLineWidth, kDefaultLineWidth, _radius, _radius - kDefaultLineWidth);
CGContextAddArcToPoint(context, kDefaultLineWidth, kDefaultLineWidth, _radius, kDefaultLineWidth, _radius - kDefaultLineWidth);
CGContextClosePath(context);
CGContextClip(context);
// now draw the yellow bar
float progressWidth = _progress * _progressBarWidth;
CGContextMoveToPoint(context, progressWidth, kDefaultLineWidth);
CGContextAddArcToPoint(context, kDefaultLineWidth, kDefaultLineWidth, kDefaultLineWidth, _radius, _radius - kDefaultLineWidth);
CGContextAddArcToPoint(context, kDefaultLineWidth, 2.0 * _radius - kDefaultLineWidth, _radius, 2.0 * _radius - kDefaultLineWidth, _radius - kDefaultLineWidth);
CGContextAddLineToPoint(context, progressWidth, 2.0 * _radius - kDefaultLineWidth);
CGContextClosePath(context);
CGContextClip(context);
startPoint = CGPointMake(progressWidth / 2.0, kDefaultLineWidth);
endPoint = CGPointMake(progressWidth / 2.0, 2.0 * _radius - kDefaultLineWidth);
CGContextDrawLinearGradient(context, gradient, startPoint, endPoint, 0);
CGGradientRelease(gradient);
CGColorSpaceRelease(baseSpace);
CGContextRestoreGState(context);
// draw the scale
CGContextSetLineWidth(context, 0.25f);
CGContextSetStrokeColorWithColor(context, [UIColor whiteColor].CGColor);
float div = _progressBarWidth / 10;
for (float i = 1; i < 10; i++) {
CGContextMoveToPoint(context, div * i, 0.25);
CGContextAddLineToPoint(context, div * i, _radius * 2.0 + 1.75);
CGContextDrawPath(context, kCGPathStroke);
}
CGContextSetStrokeColorWithColor(context, [UIColor darkGrayColor].CGColor);
for (float i = 1; i < 10; i++) {
CGContextMoveToPoint(context, div * i - 0.5, 0.25);
CGContextAddLineToPoint(context, div * i - 0.5, _radius * 2.0 + 1.75);
CGContextDrawPath(context, kCGPathStroke);
}
}
0% 和 75% 的进度条图像:
谢谢你的帮助。