使用UIBezierPath和CAShapeLayer自定义圆形进度

news/2024/7/8 2:09:56

直线的进度条并不能满足日常的开发需求,所以我们使用UIBezierPath和CAShapeLayer来自定义

一、需要用到的知识

1.UIBezierPath

贝塞尔曲线,可以画出我们想要的许多图形。

2.CAShapeLayer

CALayer的子类,配合贝塞尔曲线实现我们的自定义控件。

UIBezierPath和CAShapeLayer的详细介绍,网上有很多。

二、自定义进度视图

1.扇形进度

    _startAngle = - M_PI_2;
    _endAngle = _startAngle + _progress * M_PI * 2;
    
    UIBezierPath *fillPath = [UIBezierPath bezierPathWithArcCenter:_origin radius:_radius startAngle:_startAngle endAngle:_endAngle clockwise:YES];
    [fillPath addLineToPoint:_origin];
    _fillLayer.path = fillPath.CGPath;
    _fillLayer.fillColor = _fillColor.CGColor;
复制代码

2.球形进度

    _startAngle = M_PI_2 - _progress * M_PI;
    _endAngle = M_PI_2 + _progress * M_PI;
    
    UIBezierPath *fillPath = [UIBezierPath bezierPathWithArcCenter:_origin radius:_radius startAngle:_startAngle endAngle:_endAngle clockwise:YES];
    _fillLayer.path = fillPath.CGPath;
复制代码

3.圆弧进度

    _startAngle = - M_PI_2;
    _endAngle = _startAngle + _progress * M_PI * 2;
    
    UIBezierPath *topPath = [UIBezierPath bezierPathWithArcCenter:_origin radius:_radius - _topWidth startAngle:_startAngle endAngle:_endAngle clockwise:YES];
    _topLayer.path = topPath.CGPath;
复制代码

4.波浪进度

    CGFloat y = _waveY;
    UIBezierPath *path = [UIBezierPath bezierPath];
    [path moveToPoint:CGPointMake(0, y)];
    for (CGFloat x = 0.0; x <= _waveWidth; x++) {
        y = _waveA * sin(_waveP * x + _waveX + 0.5) + _waveY;
        [path addLineToPoint:CGPointMake(x, y)];
    }
    [path addLineToPoint:CGPointMake(_waveWidth, self.bounds.size.height)];
    [path addLineToPoint:CGPointMake(0, self.bounds.size.height)];
    [path closePath];
    _waveLayer.path = path.CGPath;
复制代码

5.渐变色进度

    //渐变层的创建
    CALayer *gradientLayer = [CALayer layer];
    
    CAGradientLayer *leftGradient = [CAGradientLayer layer];
    leftGradient.frame = CGRectMake(-layerWidth/2, -layerWidth/2, self.bounds.size.width / 2 + layerWidth/2, self.bounds.size.height + layerWidth);
    leftGradient.colors = @[(id)[UIColor yellowColor].CGColor,
                            (id)[UIColor redColor].CGColor];
    [leftGradient setLocations:@[@0.3, @0.9, @1]];

    CAGradientLayer *rightGradient = [CAGradientLayer layer];
    rightGradient.frame = CGRectMake(self.bounds.size.width / 2, -layerWidth/2, self.bounds.size.width / 2 + layerWidth/2, self.bounds.size.height + layerWidth);
    rightGradient.colors = @[(id)[UIColor yellowColor].CGColor,
                             (id)[UIColor greenColor].CGColor];
    [rightGradient setLocations:@[@0.3, @0.9, @1]];
    
    [gradientLayer addSublayer:leftGradient];
    [gradientLayer addSublayer:rightGradient];
    
    [gradientLayer setMask:_topLayer];
    [self.layer addSublayer:gradientLayer];
复制代码

github下载地址 ZXYProgressView

转载于:https://juejin.im/post/5a30c5caf265da430a50918f


http://www.niftyadmin.cn/n/1999237.html

相关文章

计算机考试第一题英语,(计算机英语试题及答案.doc

(计算机英语试题及答案KEY TO COMPUTER ENGLISH TESTPAPER ONE(120 minutes)Part One: Translate the following words from English into Chinese and vice versa. (10 points)template(模板)algorithm(算法)retrieve(检索)embed(把…嵌入)firmware(固件)topology(拓扑结构)me…

Android中JNI的使用方法

from://http://www.cnblogs.com/bastard/archive/2012/05/19/2508913.html Android中JNI的使用方法 首先看一下Android平台的框架图&#xff1a;&#xff08;网上盗用&#xff09; 可以看到Android上层的Application和ApplicationFramework都是使用Java编写&#xff0c; 底层包…

使用模式集成UML视图

使用模式集成UML视图关键字&#xff1a;UML视图摘要 模式 在系统组合&#xff08;合成&#xff09;期间对养成重用可重复设计和 体系结构 配置的习惯很重要。本论文研究关于模式的知识&#xff0c;它也可用于系统分析检验系统模型的完整性。为了支持自动分析过程&#xff0c;该…

计算机磁盘在线分区,电脑硬盘如何分区

本文介绍的是用FDISK在DOS状态下分区, 这个对初学者来说比较难懂,实际上目前也不是用的太多,了解下就行了。我们还可以通过其他可视化的软件来对硬盘进行分区。总结了下, 分区的情况不外乎以下几种&#xff1a;1. 新电脑装系统时候进行分区这个主要在装新机器时候用,磁盘上的数…

13.强符号和弱符号

我们在编写代码的过程中经常会遇到一种叫做符号重复定义&#xff08;Multiple Definition&#xff09;的错误&#xff0c;这是因为在多个源文件中定义了名字相同的全局变量&#xff0c;并且都将它们初始化了。 例如&#xff0c;在 a.c 中定义了全局变量 global&#xff1a; int…

根号3136用计算机,根号1·100的平方根和立方根是多少

.算术平方根\x09立方根1\x091\x09 12\x091.414213562\x091.1224620483\x091.732050808\x091.2009369554\x092\x09 1.259921055\x092.236067977\x091.3076604866\x092.449489743\x091.3480061557\x092.645751311\x091.3830875548\x092.828427125\x091.4142135629\x093\x09 1.442…

RunTime运行时(一)

转自原文地址&#xff1a;http://blog.csdn.net/wzzvictory/article/details/8615569 作为一门动态编程语言&#xff0c;Objective-C 会尽可能的将编译和链接时要做的事情推迟到运行时。只要有可能,Objective-C 总是使用动态 的方式来解决问题。这意味着 Objective-C 语言不仅需…

武汉音乐学院计算机课,武汉音乐学院课程免修与自修管理规定(修订)

武汉音乐学院课程免修与自修管理规定(修订)武音教务〔2018〕15号为了鼓励学生自主学习&#xff0c;提高学习效率&#xff0c;实行人才培养目标&#xff0c;特制订本暂行规定。第一章 免 修第一条 学生通过学校组织的课程免修考试或在校期间参加相应的国家级考试&#xff0c;成绩…