效果

#import <UIKit/UIKit.h>@interface HWCircleView : UIView@property (nonatomic, assign) CGFloat progress;//进度条颜色
@property(nonatomic,strong) UIColor *progerssColor;
//进度条背景颜色
@property(nonatomic,strong) UIColor *progerssBackgroundColor;
//进度条的宽度
@property(nonatomic,assign) CGFloat progerWidth;
//进度数据字体大小
@property(nonatomic,assign)CGFloat percentageFontSize;
//进度数字颜色
@property(nonatomic,strong) UIColor *percentFontColor;@end

#import "HWCircleView.h"@interface HWCircleView ()@property (nonatomic, weak) UILabel *cLabel;@end@implementation HWCircleView- (instancetype)initWithFrame:(CGRect)frame
{if (self = [super initWithFrame:frame]) {self.backgroundColor = [UIColor clearColor];//默认颜色self.progerssBackgroundColor=[UIColor lightGrayColor];self.progerssColor=[UIColor blueColor];self.percentFontColor=[UIColor blueColor];//默认进度条宽度self.progerWidth=15;//默认百分比字体大小self.percentageFontSize=22;//百分比标签UILabel *cLabel = [[UILabel alloc] initWithFrame:self.bounds];cLabel.font = [UIFont boldSystemFontOfSize:self.percentageFontSize];cLabel.textColor = self.percentFontColor;cLabel.textAlignment = NSTextAlignmentCenter;[self addSubview:cLabel];self.cLabel = cLabel;}return self;
}- (void)setProgress:(CGFloat)progress
{_progress = progress;_cLabel.text = [NSString stringWithFormat:@"%d%%", (int)floor(progress * 100)];[self setNeedsDisplay];
}- (void)drawRect:(CGRect)rect
{//路径UIBezierPath *backgroundPath = [[UIBezierPath alloc] init];//线宽backgroundPath.lineWidth = self.progerWidth;//颜色[self.progerssBackgroundColor set];//拐角backgroundPath.lineCapStyle = kCGLineCapRound;backgroundPath.lineJoinStyle = kCGLineJoinRound;//半径CGFloat radius = (MIN(rect.size.width, rect.size.height) - self.progerWidth) * 0.5;//画弧(参数:中心、半径、起始角度(3点钟方向为0)、结束角度、是否顺时针)[backgroundPath addArcWithCenter:(CGPoint){rect.size.width * 0.5, rect.size.height * 0.5} radius:radius startAngle:M_PI * 1.5 endAngle:M_PI * 1.5 + M_PI * 2  clockwise:YES];//连线[backgroundPath stroke];//路径UIBezierPath *progressPath = [[UIBezierPath alloc] init];//线宽progressPath.lineWidth = self.progerWidth;//颜色[self.progerssColor set];//拐角progressPath.lineCapStyle = kCGLineCapRound;progressPath.lineJoinStyle = kCGLineJoinRound;//画弧(参数:中心、半径、起始角度(3点钟方向为0)、结束角度、是否顺时针)[progressPath addArcWithCenter:(CGPoint){rect.size.width * 0.5, rect.size.height * 0.5} radius:radius startAngle:M_PI * 1.5 endAngle:M_PI * 1.5 + M_PI * 2 * _progress clockwise:YES];//连线[progressPath stroke];
}@end
使用
@property (nonatomic, strong) NSTimer *timer;
@property (nonatomic, weak) HWCircleView *circleView;- (void)viewDidLoad {[super viewDidLoad];//创建控件HWCircleView *circleView = [[HWCircleView alloc] initWithFrame:CGRectMake(50, 200, 150, 150)];[self.view addSubview:circleView];self.circleView = circleView;;//添加定时器[self addTimer];
}- (void)addTimer
{
//创建定时器_timer = [NSTimer scheduledTimerWithTimeInterval:0.2f target:self selector:@selector(timerAction) userInfo:nil repeats:YES];[[NSRunLoop mainRunLoop] addTimer:_timer forMode:NSRunLoopCommonModes];
}- (void)timerAction
{_circleView.progress += 0.01;if (_circleView.progress >= 1) {[self removeTimer];NSLog(@"完成");}
}- (void)removeTimer
{[_timer invalidate];_timer = nil;
}

简述一下

UIView的setNeedsDisplay和setNeedsLayout方法

首先两个方法都是异步执行的。而setNeedsDisplay会调用自动调用drawRect方法进行绘制功能,这样可以拿到 UIGraphicsGetCurrentContext,就可以进行绘制了。而setNeedsLayout会默认调用layoutSubViews,
就可以 处理子视图中的一些数据。
综上所诉,setNeedsDisplay方便绘图,而layoutSubViews方便出来数据。


layoutSubviews在以下情况下会被调用

1、init初始化不会触发layoutSubviews。
2、addSubview会触发layoutSubviews。
3、设置view的Frame会触发layoutSubviews,当然前提是frame的值设置前后发生了变化。
4、滚动一个UIScrollView会触发layoutSubviews。
5、旋转Screen会触发父UIView上的layoutSubviews事件。
6、改变一个UIView大小的时候也会触发父UIView上的layoutSubviews事件。
7、直接调用setLayoutSubviews。


drawRect在以下情况下会被调用:

1、如果在UIView初始化时没有设置rect大小,将直接导致drawRect不被自动调用。drawRect调用是在Controller->loadView, Controller->viewDidLoad 两方法之后掉用的.所以不用担心在控制器中,这些View的drawRect就开始画了.这样可以在控制器中设置一些值给View(如果这些View draw的时候需要用到某些变量值).

2、该方法在调用sizeToFit后被调用,所以可以先调用sizeToFit计算出size。然后系统自动调用drawRect:方法。

3、通过设置contentMode属性值为UIViewContentModeRedraw。那么将在每次设置或更改frame的时候自动调用drawRect:。

4、直接调用setNeedsDisplay,或者setNeedsDisplayInRect:触发drawRect:,但是有个前提条件是rect不能为0。
以上1,2推荐;而3,4不提倡


drawRect方法使用注意点:

1、若使用UIView绘图,只能在drawRect:方法中获取相应的contextRef并绘图。如果在其他方法中获取将获取到一个invalidate的ref并且不能用于画图。drawRect:方法不能手动显示调用,必须通过调用setNeedsDisplay 或者 setNeedsDisplayInRect,让系统自动调该方法。
2、若使用CAlayer绘图,只能在drawInContext: 中(类似于drawRect)绘制,或者在delegate中的相应方法绘制。同样也是调用setNeedDisplay等间接调用以上方法
3、若要实时画图,不能使用gestureRecognizer,只能使用touchbegan等方法来掉用setNeedsDisplay实时刷新屏幕

ios 自定义圆环进度条相关推荐

  1. ios自定义条形进度条

    2019独角兽企业重金招聘Python工程师标准>>> 题记 在今天这个变化多端的世界,我们最大的危险不是外界的压力与竞争,而是我们内心的模式,这些模式决定我们看到些什么,感受到些什 ...

  2. android自定义view圆环,Android自定义View实现圆环进度条

    本文实例为大家分享了android自定义view实现圆环进度条的具体代码,供大家参考,具体内容如下 效果展示 动画效果 view实现 1.底层圆环是灰色背景 2.上层圆环是红色背景 3.使用动画画一条 ...

  3. 自定义View圆环进度条

    相信大家都对自定义view有所了解,今天给大家展示一下我自己写的小Demo,一个自定义环形进度条,进度在不断加载的过程中颜色呈现渐变效果,并且中间的Textview展示进度值,有两个button控制暂 ...

  4. uni-app中自定义图表(canvas实现chart图表)开发篇(5)-圆环进度条添加动画效果

    这里增加一篇介绍下进度条动画效果如何添加,前几篇的进度值被修改后,切换效果比较生硬.另外也在第四篇基础上,对图形略作修改.在查看uniapp文档时,没有发现重绘执行函数,小程序中有Canvas.req ...

  5. YCProgress自定义百分比进度条

    目录介绍 1.本库优势亮点 2.使用介绍 2.1 圆环百分比进度条 2.2 直线百分比进度条 2.3 仿杀毒类型百分比进度条 3.注意要点 4.效果展示 5.其他介绍 1.本库优势亮点 圆环百分比进度 ...

  6. Android 自定义View,自定义属性--自定义圆形进度条(整理)

    很多的时候,系统自带的View满足不了我们的功能需求,那么我们就需要自定义View来满足我们的需求 自定义View时要先继承View,添加类的构造方法,重写父类View的一些方法,例如onDraw,为 ...

  7. android绘制环形进度_Android动态自定义圆形进度条

    这篇文章主要介绍了Android动态自定义圆形进度条,需要的朋友可以参考下 效果图: A.绘制圆环,圆弧,文本 //1.画圆环 //原点坐标 float circleX = width / 2; fl ...

  8. android自定义带进度条的圆形图片

    前言:在项目听新闻的改版中需要实现环绕圆形新闻图片的进度条功能,作为技术预备工作我就去看了一些网上的相关的原理,做了一个自定义带进度条的圆形图片的demo,并将这个实现写成文章发布出来,谁需要了可以进 ...

  9. 【微信小程序】圆环进度条

    目录 一.需求分析 二.实现效果 三.实现过程 四.完整代码 一.需求分析 ① 生成用于倒计时的圆环,通过代码来控制圆环的倒计时进度.要做到重新进页面,圆环不会重新归零. ② 圆环中间会有倒计时 ③ ...

最新文章

  1. 博科VP:闪存推动了与之相匹配的第六代FC的发展
  2. 深入理解javascript原型和闭包(18)——补充:上下文环境和作用域的关系
  3. spark读取文件源码分析-1
  4. 光线在传播过程中是否会有变化?可以通过镜子接力的方式抵达目的地吗!?...
  5. AEF横空出世——几个重要的概念
  6. 10万码农五年的C语言笔记!你现在知道别人为什么这么优秀了吗?
  7. python特定数之和_python-在特定时间范围内来自pandas数据帧的值的总和
  8. js 如何将java list集合转换成var类型数组_零基础参加郑州Java培训 一定要注意Arrays.asList的用法...
  9. WINX的消息分派机制(续)
  10. windows下如何下载g++以及gcc
  11. 什么是JSONP及其实现原理
  12. 开心网(http://www.kaixin001.com)的一些JS代码分享
  13. 使用NPOI导出Excel模板
  14. 洛谷-5149 会议座位
  15. 20155210 2016-2017-2 《Java程序设计》第7周学习总结
  16. BFC——通俗理解什么是BFC
  17. python复制excel模板并保留表格样式
  18. 直连线和交叉线的做法
  19. 为什么要BI(商业智能)?
  20. 手势识别系统的发展前景

热门文章

  1. PyTorch 1.3发布!能在移动端部署,支持Colab云TPU,阿里云上也能用
  2. 重磅!TensorFlow 2.0 来了!
  3. MySQL事件与定时器,mysql下存储过程与定时器
  4. mysql+php+模板+条目_PHP.MVC的模板标签系统(四)
  5. 程序员在火车站候车室写代码画面曝光,网友:程序员的悲哀
  6. 带你详细了解机器视觉竞赛—ILSVRC竞赛
  7. 简单粗暴,快速入门Python
  8. java调用app接口代码_java servlet手机app访问接口(二)短信验证
  9. jquery ajax 跨域_Laravel 的跨域问题解决方案
  10. python treeview显示多列_Python Gtk TreeView列数据显示