在做音频项目的时候,播放音频需要显示圆形进度条。今天,教大家如何简单地实现进度条效果!
其实,实现这种效果并不困难。前提是需要了解UIBezierPath,如果未接触过,可以先阅读笔者在很久以前所写过的一篇文章:UIBezierPath精讲
当然,之前在实现 高级动画-圆形树展开、收起动画 一文中教了大家如何实现渐变圆形进度条,那是采用mask来实现的。
不过,今天教大家做的效果,并没有使用mask,而是直接使用UIBezierPath来实现。
首先,我们需要新建一个HYBCircleProgressView类,这样才能对整体旋转!
@interfaceHYBCircleProgressView: UIView // 设置图片 - (void)setImageURL:(NSString *)url; // 更新进度 - (void)updateProgressWithNumber:(NSUInteger)number; @end
创建图片:
CGRect frame = self.frame; self.layer.cornerRadius = frame.size.width / 2; self.layer.masksToBounds = YES; self.imageView = [[UIImageView alloc]initWithFrame:self.bounds]; [selfaddSubview:self.imageView];
首先,创建CAShapeLayer对象,然后生成圆形path,并设置画笔颜色为灰色,线宽(圆环的宽)为2,而内容填充色设置为透明色,然后将此层添加到self.layer上:
self.outLayer = [CAShapeLayer layer]; CGRect rect = {kLineWidth / 2, kLineWidth / 2, frame.size.width - kLineWidth, frame.size.height - kLineWidth}; UIBezierPath *path = [UIBezierPathbezierPathWithOvalInRect:rect]; self.outLayer.strokeColor = [UIColor lightGrayColor].CGColor; self.outLayer.lineWidth = kLineWidth; self.outLayer.fillColor = [UIColor clearColor].CGColor; self.outLayer.lineCap = kCALineCapRound; self.outLayer.path = path.CGPath; [self.layeraddSublayer:self.outLayer];
这一步与第一步相当,只是修改画笔颜色为蓝色而已。所使用的path与第一步的是一样的:
self.progressLayer = [CAShapeLayer layer]; self.progressLayer.fillColor = [UIColor clearColor].CGColor; self.progressLayer.strokeColor = [UIColor blueColor].CGColor; self.progressLayer.lineWidth = kLineWidth; self.progressLayer.lineCap = kCALineCapRound; self.progressLayer.path = path.CGPath; [self.layeraddSublayer:self.progressLayer];
到这一步,可以看到的效果是这样的:
从效果图可以看到,图片是正立的,但是进度条的起点是从3点钟方向开始的,也就是M 2 PI开始顺时钟方向变化。可我们希望是从12点钟方向开始顺时钟变化的,那么解决办法就是旋转!看第三步。
将整体旋转-90度,使进度起点为12点钟的位置:
self.transform = CGAffineTransformMakeRotation(-M_PI_2);
此时效果是这样的:
图片也跟着旋转了,这不是我们要的效果啊。那么怎么办呢?同样的道理,将图片控件再旋转90度即可:
self.imageView.transform = CGAffineTransformMakeRotation(M_PI_2);
调整这个进度,其中就是调整strokeEnd,这个属性是支持隐式动画的:
- (void)updateProgressWithNumber:(NSUInteger)number { [CATransaction begin]; [CATransactionsetAnimationTimingFunction:[CAMediaTimingFunctionfunctionWithName:kCAMediaTimingFunctionEaseIn]]; [CATransactionsetAnimationDuration:0.5]; self.progressLayer.strokeEnd = number / 100.0; [CATransaction commit]; }
请大家不要找我要完整的demo,这已经是所有代码了,只不过是没有将构造方式放出来而已!
这里是巧妙地利用旋转来调整起点,又利用贝塞尔曲线来实现所谓地镂空图!看到这里,是不是觉得很简单呢?其实也就那么回事!
联系方式 | 关注 | 备注 |
---|---|---|
合作联系群 | 347363861 | 接项目、私活 |
iOS直播音视频技术 | 256239496 | 实名制且群规严,定期清理 |
标哥博客iOS交流群 | 552095943(新) | 群里很活跃,定期清理 |
标哥博客iOS交流群 | 324400294(满)|494669518(满)|494669518(满)|250351140(满) | 群里很活跃,定期清理 |
微信公众号 | iOSDevShares或者iOS开发技术分享 | 关注公众号阅读好文章 |
新浪微博 | @标哥的技术博客 | 关注微博动态 |
GITHUB | CoderJackyHuang | 文章Demo都在GITHUB |
联系标哥 | 关于标哥 | 保持活跃在最前线 |
版权声明:本文为【标哥的技术博客】原创出品,欢迎转载,转载时请注明出处!