本文转载自:http://blog.csdn.net/zhoutao198712/article/details/20864143


Github上看到一些进度条的功能,都是通过Core
Graph来实现。无所谓正确与否,但是开发效率明显就差很多了,而且运行效率还是值得考究的。其实使用苹果提供的Core
Animation能够非常简单和方便的实现环形进度条效果,而且还可以高效的保证动画效果,无论是前进还是后退(语言水平比较有限,就多用代码说话)。

1、先来一个结果

80%的状态:

99%的状态:

2、需要用到的宏:

[objc] view
plain
copy

 
  1. #define degreesToRadians(x) (M_PI*(x)/180.0) //把角度转换成PI的方式
    #define  PROGREESS_WIDTH 80 //圆直径 
    #define PROGRESS_LINE_WIDTH 4 //弧线的宽度

3、CAShapeLayer

首先,你得要引入Core Animation框架。为了实现环形效果,需要使用到CAShapeLayer,原理是CAShapeLayer可以通过指定Path的方式实现生成一个图形,非常方便。

4、UIBezierPath

由于需要画一个圆形,UIBeziperPath是非常好用的画圆形的工具。实现下面的代码可以画出上面所示的整个轨道。这个圆形是从-210度的角度到30度。

[objc] view
plain
copy

 
  1. UIBezierPath:CGPointMake(00 radius2:degreesToRadians(-1):degreesToRadians(0 clockwiseYES];

5、画出一个完成的进度的背景轨道

这里原理很简单,就是使用CAShapeLayer和UIBezierPath结合起来就能够达成目标,这一步的结果如下所示:

[objc] view
plain
copy

 
  1. _trackLayer = [CAShapeLayer];
  2. .frameself;
  3. self addSublayer
    .fillColor]];
  4. = [_strokeColor];
  5. .opacity.25
  6. .lineCap
  7. .lineWidth
  8. UIBezierPath:CGPointMake(00 radius2:degreesToRadians(-1):degreesToRadians(0 clockwiseYES
  9. .path];

6、渐变进度条:

首先要明确的需求是,我们需要颜色根据百分比从红色渐变到黄色然后再到蓝色。
怎么实现这个颜色的渐变效果。这里我们需要使用到CAGradientLayer,CAGradientLayer
是一个用来画颜色渐变的层(如果使用透明的颜色,也就可以做到透明渐变)。我们先用CAGradientLayer做出渐变效果,然后把
ShapeLayer作为GradientLayer的Mask来截取出需要的部分,以此达到渐变的进度条效果。

首先,需要构建出顺着弧形的颜色渐变。上面的需求我们可以分解成两部分。
    ①左半部分,颜色从红色渐变到黄色。
    ②右半部分,颜色从黄色渐变到蓝色。
    由此可以了解到是我们需要两个CAShapeLayer。
    为什么要这么折腾?CAShapeLayer不能顺着弧线进行渐变只能指定两个点之间进行渐变。所以只能曲线救国了。
    先看看这个部分的效果:

然后,创建一个新的CAShapeLayer来截取这个颜色渐变的层。
    这部分代码如下所示:

[html] view
plain
copy

 
  1. _progressLayer
    _progressLayer.frame.bounds;
  2. _progressLayer.fillColor
    _progressLayer.strokeColor
    _progressLayer.lineCap;
  3. _progressLayer.lineWidth;
  4. _progressLayer.path
    _progressLayer.strokeEnd;
  5. = [CALayer layer];
  6. =  [CAGradientLayer layer];
  7. gradientLayer1.frame(0, 0, self.width/2, self.height);
  8. =  [CAGradientLayer layer];
  9. gradientLayer2.frame(self.width/2, 0, self.width/2, self.height);
  10. [self.layer addSublayer:gradientLayer];

7、进度条效果

走到上面一步我们得到的效果是一个进度为100%的效果,_progressLayer的长度和_trackLayer的长度是一样的。那么怎么解决百分比的问题呢?

CAShapeLayer有一个strokeEnd的属性,这个属性是从0到1的浮点类型,正好可以用表达百分比,而且这个属性是animatable,可以动态的表示进度的变化。
如下代码所示:

[objc] view
plain
copy

 
  1. -(void animatedBOOL

    ];

  2. :!animated];
  3. :[CAMediaTimingFunction:kCAMediaTimingFunctionEaseIn]];
  4. :MAIN_SCREEN_ANIMATION_TIME];
  5. = percent/0.0
    ];
  6. }

8、总结

①进度条的百分比是通过CAShapeLayer的strokeEnd属性来实现。
②环形的渐变进度条,通过结合CAShapeLayer和CAGradientLayer实现,注意layer的mask属性的使用。

原文链接:http://www.ganlvji.com/gradient_circle_progress/

iOS 之使用CAShapeLayer中的CAGradientLayer实现圆环的颜色渐变的更多相关文章

  1. iOS 如何自定义UISearchBar 中textField的高度

    iOS 如何自定义UISearchBar 中textField的高度 只需设置下边的方法就可以 [_searchBar setSearchFieldBackgroundImage:[UIImage i ...

  2. iOS之在webView中引入本地html,image,js,css文件的方法 - sky//////////////////////////////////////ZZZZZZZZZZZZZZZ

    iOS之在webView中引入本地html,image,js,css文件的方法   2014-12-08 20:00:16CSDN-sky_2016-点击数:10292     项目需求 最近开发的项 ...

  3. iOS / Android 移动设备中的 Touch Icons

    上次转载了一篇<将你的网站打造成一个iOS Web App>,但偶然发现这篇文章的内容有些是错误的——准确来说也不是错误,只是不适合自半年前来的情况了(也可以说是iOS7 之后的时间)—— ...

  4. iOS 自定义控件开发(中)

    <iOS 自定义控件开发(上)> <iOS 自定义控件开发(中)> 接上篇iOS自定义控件开发之后,我们尝试另外一种. 在Xcode的右边,会看到如下的图 其中,上面有一个:C ...

  5. 关于ios项目沙盒中的文件和Xcode项目创建的文件

    //1.1获取在Xcode项目打开的情况下创建的Plist文件 NSString *path = [[NSBundle mainBundle]pathForResource:@"Profes ...

  6. iOS已发布应用中对异常信息捕获和处理

    iOS已发布应用中对异常信息捕获和处理 iOS开发中我们会遇到程序抛出异常退出的情况,如果是在调试的过程中,异常的信息是一目了然,但是如果是在已经发布的程序中,获取异常的信息有时候是比较困难的. iO ...

  7. IOS获取物理尺寸中7Plus中获取的是7的物理尺寸

    IOS获取物理尺寸中7Plus中获取的是7的物理尺寸: 在开发调试过程中我的7Plus手机获取[uiscreen mainscreen].bounds为750  .1334. 解决方案:在手机中的显示 ...

  8. ios从相册:摄像头中获取视频

    ios从相册/摄像头中获取视频 如何从相册中获取视频 使用的是一个和获取照片相同的类UIImagePickerController //相册中获取视频 - (IBAction)clickViedoOF ...

  9. iOS和OS X中的bundle

    bundle也可以称之为包(package). 它在iOS和OS X中实际为一个文件夹但却当成单独的文件来对待. 每一个app都有一个bundle,并且你可以通过在xxx.app图标上右击鼠标然后选择 ...

随机推荐

  1. SqlCacheDependency的使用

    最近项目需要几秒就获取一次数据,查数据库服务器压力会很大,因此用缓存技术来缓解服务器压力. 使用SqlCacheDependency采用轮询的方式来获取缓存,SqlDependency查询通知的方式来 ...

  2. 替换Avada主题的Google字体

    刚玩WP的时候图省事,在themeforest买了排行第一的主题Avada,虽然强大,但对我目前的Blog应用而言实在太'重'了.而且老外的主题很多方面不接地气,比如谷歌字体.本文指导各位如何在Ava ...

  3. JavaWeb解释一下什么是 servlet?

    Servlet是一种独立于平台和协议的服务端的java技术,可以生成动态WEB页面与传统的CGI(计算机图形接口)和其他类似的CGI技术相比.Servlet具有更好的可移植性.更强大的功能,更少的投资 ...

  4. MysqlHelp

    using System.Configuration;using MySql.Data: public class MySqlHelp { //链接字符串 private static string ...

  5. Ubuntu 12.04环境下配置Postgresql和phppgadmin

    Ubuntu 12.04环境下配置Postgresql 9.1 和phppgadmin 本系列文章由ex_net(张建波)编写,转载请注明出处. http://blog.csdn.net/zjianb ...

  6. [转]IOS 中文排序

    转自:http://www.cnblogs.com/syxchina/archive/2012/10/11/2720257.html 1 原因 Ios默认使用utf-8格式编码,所以中文在IOS中默认 ...

  7. Springmvc异步上传文件

    <script src="js/jquery.js" type="text/javascript"></script><scrip ...

  8. Bootstrap Alert 使用

    参考 http://www.bootcss.com/javascript.html#alerts 不过这里没有动态alert的例子 于是再参考http://stackoverflow.com/ques ...

  9. python Unicode转ascii码的一种方法

    缘起 看到这样的数据:Marek Čech.Beniardá怎样变成相对应的ascii码呢 解决 import unicodedata s = u"Marek Čech" #(u表 ...

  10. COBOL学习

    COBOL概述 什么是COBOL语言:            COBOL是Common Business Oriented Language的缩写,是面向商业通用编程语言.它是专门为商业数据处理而设计 ...