UIBezierPath可以绘制矢量路径,而CAShapeLayer是Layer的子类,可以在屏幕进行绘制,本文主要思想是:CAShapeLayer按照UIBezierPath的矢量路径进行绘制。

效果图如图:

方法如下:

@interface ViewController (){CAShapeLayer *shapeLayer;NSTimer *timer;
}@end@implementation ViewController- (void)viewDidLoad {[super viewDidLoad];//第一步,通过UIBezierPath设置圆形的矢量路径UIBezierPath *circle = [UIBezierPath bezierPathWithOvalInRect:CGRectMake(0, 0, 200, 200)];//第二步,用CAShapeLayer沿着第一步的路径画一个完整的环(颜色灰色,起始点0,终结点1)CAShapeLayer *bgLayer = [CAShapeLayer layer];bgLayer.frame = CGRectMake(0, 0, 200, 200);//设置FramebgLayer.position = self.view.center;//居中显示bgLayer.fillColor = [UIColor clearColor].CGColor;//填充颜色=透明色bgLayer.lineWidth = 2.f;//线条大小bgLayer.strokeColor = [UIColor grayColor].CGColor;//线条颜色bgLayer.strokeStart = 0.f;//路径开始位置bgLayer.strokeEnd = 1.f;//路径结束位置bgLayer.path = circle.CGPath;//设置bgLayer的绘制路径为circle的路径[self.view.layer addSublayer:bgLayer];//添加到屏幕上//第三步,用CAShapeLayer沿着第一步的路径画一个红色的环形进度条,但是起始点=终结点=0,所以开始不可见shapeLayer = [CAShapeLayer layer];shapeLayer.frame = CGRectMake(0, 0, 200, 200);shapeLayer.position = self.view.center;shapeLayer.fillColor = [UIColor clearColor].CGColor;shapeLayer.lineWidth = 2.f;shapeLayer.strokeColor = [UIColor redColor].CGColor;shapeLayer.strokeStart = 0;shapeLayer.strokeEnd = 0;shapeLayer.path = circle.CGPath;[self.view.layer addSublayer:shapeLayer];//第四步,用一个定时器进行测试,每一秒,进度加10%timer = [NSTimer scheduledTimerWithTimeInterval:1.f target:self selector:@selector(animate) userInfo:nil repeats:YES];
}-(void)animate{shapeLayer.strokeEnd += 0.1;
}

我们可以对以上代码封装为一个CircleView,继承自View,封装后代码如下:

CircleView.h文件

#import <UIKit/UIKit.h>@interface CircleView : UIView@property(assign,nonatomic)CGFloat startValue;
@property(assign,nonatomic)CGFloat lineWidth;
@property(assign,nonatomic)CGFloat value;
@property(strong,nonatomic)UIColor *lineColr;@end

CircleView.m文件

#import "CircleView.h"@interface CircleView()
@property(strong,nonatomic)UIBezierPath *path;
@property(strong,nonatomic)CAShapeLayer *shapeLayer;
@property(strong,nonatomic)CAShapeLayer *bgLayer;@end@implementation CircleView- (instancetype)initWithFrame:(CGRect)frame
{self = [super initWithFrame:frame];if (self) {_path = [UIBezierPath bezierPathWithOvalInRect:self.bounds];_bgLayer = [CAShapeLayer layer];_bgLayer.frame = self.bounds;_bgLayer.fillColor = [UIColor clearColor].CGColor;_bgLayer.lineWidth = 2.f;_bgLayer.strokeColor = [UIColor grayColor].CGColor;_bgLayer.strokeStart = 0.f;_bgLayer.strokeEnd = 1.f;_bgLayer.path = _path.CGPath;[self.layer addSublayer:_bgLayer];_shapeLayer = [CAShapeLayer layer];_shapeLayer.frame = self.bounds;_shapeLayer.fillColor = [UIColor clearColor].CGColor;_shapeLayer.lineWidth = 2.f;_shapeLayer.lineCap = kCALineCapRound;_shapeLayer.strokeColor = [UIColor redColor].CGColor;_shapeLayer.strokeStart = 0.f;_shapeLayer.strokeEnd = 0.f;_shapeLayer.path = _path.CGPath;[self.layer addSublayer:_shapeLayer];}return self;
}@synthesize value = _value;
-(void)setValue:(CGFloat)value{_value = value;_shapeLayer.strokeEnd = value;
}
-(CGFloat)value{return _value;
}@synthesize lineColr = _lineColr;
-(void)setLineColr:(UIColor *)lineColr{_lineColr = lineColr;_shapeLayer.strokeColor = lineColr.CGColor;
}
-(UIColor*)lineColr{return _lineColr;
}@synthesize lineWidth = _lineWidth;
-(void)setLineWidth:(CGFloat)lineWidth{_lineWidth = lineWidth;_shapeLayer.lineWidth = lineWidth;_bgLayer.lineWidth = lineWidth;
}
-(CGFloat)lineWidth{return _lineWidth;
}@end

在需要使用的ViewContrller中使用以下代码调用即可

 CircleView *view = [[CircleView alloc] initWithFrame:CGRectMake(0, 0, 200, 200)];[self.view addSubview:view];view.center = self.view.center;[view setLineWidth:6.f];[view setLineColr:[UIColor redColor]];

另外默认的坐标如下图(图来自http://justsee.iteye.com/blog/1972853)

有时候我们需要开始点在顶部,即(3/2)π 处,其中一个思路是将整个View逆时针旋转90度即可,在CircleView.m的initWithFrame中添加以下代码即可:

CGAffineTransform transform = CGAffineTransformIdentity;self.transform = CGAffineTransformRotate(transform, -M_PI / 2);

iOS通过CAShapeLayer和UIBezierPath画环形进度条相关推荐

  1. MFC环形进度条实现

    MFC只支持横/竖条形进度条,并不支持环形进度条,而环形进度条在实际中使用很是广泛,以下使用GDI+自绘具有环形效果的进度条. 其实GDI+里封装有一个函数DrawArc可以画环形进度条,但它有一个缺 ...

  2. iOS 一分钟学会环形进度条

    有几篇博客写到了怎么实现环形进度条,大多是使用Core Graph来实现,实现比较麻烦且效率略低.只是一个小小的进度条而已,我们当然是用最简单而且效率高的方式来实现. 先制作一个不带颜色渐变的进度条 ...

  3. 用emWin的2D绘图函数画一个带圆形端点的环形进度条

    先上效果图,首先是顺时针转: 然后是逆时针转: 大概讲一下思路吧,首先讲一下顺时针是怎么弄的,很简单. 画圆弧函数GUI_DrawArc有起始角度a0和终止角度a1两个参数,且a0必须小于a1否则无法 ...

  4. iOS 自定义控件 progressView(环形进度条)

    转帖:http://blog.csdn.net/xiangzhang321/article/details/42688133 之前做项目的时候有用到环形进度条,先是在网上找了一下第三方控件,发现好用是 ...

  5. iOS实现一个颜色渐变的弧形进度条

    在Github上看到一些进度条的功能,都是通过Core Graph来实现.无所谓正确与否,但是开发效率明显就差很多了,而且运行效率还是值得考究的.其实使用苹果提供的Core Animation能够非常 ...

  6. ios弧形进度条_【iOS实现一个颜色渐变的弧形进度条】

    在Github上看到一些进度条的功能,都是通过Core Graph来实现.无所谓正确与否,但是开发效率明显就差很多了,而且运行效率还是值得考究的.其实使用苹果提供的Core Animation能够非常 ...

  7. 用svg实现一个环形进度条

    svg实现环形进度条需要用到的知识: 1.会使用path的d属性画一个圆环 //用svg的path元素的A命令画圆<pathd="M cx cym 0 -r a r r 0 1 0 0 ...

  8. canvas实现半圆环形进度条

    html部分 <canvas id="canvas" width="150" height="150"><p>抱歉, ...

  9. [Swift通天遁地]一、超级工具-(2)制作美观大方的环形进度条

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ ➤微信公众号:山青咏芝(shanqingyongzhi) ➤博客园地址:山青咏芝(https://www.cnblog ...

最新文章

  1. DIV CSS完美兼容IE6/IE7/FF的通用方法
  2. php 打开任意文件下载,TEC-004-php文件下载任意文件读取漏洞修复
  3. Linux负载均衡--LVS(IPVS)
  4. ASP.Net MVC 在ajax接收controller返回值为Json数据
  5. ECCV 2018 StructSiam:《Structured Siamese Network for Real-Time Visual Tracking》论文笔记
  6. ap模式和sta模式共存_锐捷AP缺省VLAN和用户VLAN那些事儿 | 运维实战家
  7. 12123选牌漏洞_12123选牌漏洞是什么?新车牌号自编自选技巧
  8. A1078. 逆序对个数
  9. python建立py文件夹过程_Pycharm创建python文件自动添加日期作者等信息(步骤详解)...
  10. 关于北大陈秉乾教授的一些趣事
  11. 浙大计算机基础知识2,[精选资料]14年浙大远程计算机基础2Windows知识题高起专 作业题2答案...
  12. 瑞星杀毒软件爆出高危漏洞 可被利用为“抓鸡工具”
  13. 全球最受欢迎的五大生产制造管理系统
  14. 数据分析师的就业薪资
  15. win7休眠不断网的设置方法
  16. Transformer靠什么基因,得以闯入CV界秒杀CNN?
  17. jQuerry实现CSS动画样式跳跃显示
  18. PE文件解析(1):Dos头与NT头
  19. android仿QQ优雅的修改App字体大小
  20. 机器学习-28-Conditional Generation by RNNAttention(条件生成和注意力机制)

热门文章

  1. Maven国内源设置 - OSChina国内源失效了,别更新了
  2. C++ primer第五版随笔--2015年1月6日
  3. 六步使用ICallbackEventHandler实现无刷新回调
  4. OpenCV 【十一】—— 图像去畸变,对极约束之undistort,initUndistortRectifyMap,undistort
  5. 深度分析typedef--定义自己的数据类型
  6. VC下提前注入进程的一些方法1——远线程不带参数
  7. FFmpeg实现获取USB摄像头视频流测试代码
  8. 修改mysql数据库默认编码为utf8
  9. embed的名词_常见名词解释
  10. python爬取电影评分_用Python爬取猫眼上的top100评分电影