iOS快速实现环形渐变进度条

前言

进度条相信我们大家都不陌生,往往我们很多时候需要使用到圆形进度条。这篇文章给大家分享了利用iOS如何快速实现环形进度条,下面来一起看看。

一:先制作一个不带颜色渐变的进度条

自定义一个cycleView,在.m 中实现drawRect方法

- (void)drawRect:(CGRect)rect {

  CGContextRef ctx = UIGraphicsGetCurrentContext();//获取上下文

  CGPoint center = CGPointMake(100, 100); //设置圆心位置
  CGFloat radius = 90; //设置半径
  CGFloat startA = - M_PI_2; //圆起点位置
  CGFloat endA = -M_PI_2 + M_PI * 2 * _progress; //圆终点位置

  UIBezierPath *path = [UIBezierPath bezierPathWithArcCenter:center radius:radius startAngle:startA endAngle:endA clockwise:YES];

  CGContextSetLineWidth(ctx, 10); //设置线条宽度
  [[UIColor blueColor] setStroke]; //设置描边颜色

  CGContextAddPath(ctx, path.CGPath); //把路径添加到上下文

  CGContextStrokePath(ctx); //渲染

}

因为drawRect方法只是在视图刚刚出现的时候执行一次,所以我们需要使用

[self setNeedsDisplay];

这个方法来进行重新绘制,

在控制器里面加一个slider,滑动slider来控制进度变化

- (void)drawProgress:(CGFloat )progress
{
  _progress = progress;
  [self setNeedsDisplay];
}

看一下效果

如果进度条不需要加渐变色,那么这儿几行代码就完成了。

下面来实现一下带有渐变色的进度条,原理很简单,刚刚画的是一条默认是黑色的线条,我们把黑色替换成一条渐变色的线条就可以了。

环形渐变色线条的制作:

第一步

使用CAShapeLayer绘制出渐变层,应为它只能指定两个点之间进行渐变,所以这里需要两个CAShapeLayer,左边一个和右边一个,看一下效果图

代码实现

//生成渐变色
  CALayer *gradientLayer = [CALayer layer];

  //左侧渐变色
  CAGradientLayer *leftLayer = [CAGradientLayer layer];
  leftLayer.frame = CGRectMake(0, 0, self.bounds.size.width / 2, self.bounds.size.height);  // 分段设置渐变色
  leftLayer.locations = @[@0.3, @0.9, @1];
  leftLayer.colors = @[(id)[UIColor yellowColor].CGColor, (id)[UIColor greenColor].CGColor];
  [gradientLayer addSublayer:leftLayer];

  //右侧渐变色
  CAGradientLayer *rightLayer = [CAGradientLayer layer];
  rightLayer.frame = CGRectMake(self.bounds.size.width / 2, 0, self.bounds.size.width / 2, self.bounds.size.height);
  rightLayer.locations = @[@0.3, @0.9, @1];
  rightLayer.colors = @[(id)[UIColor yellowColor].CGColor, (id)[UIColor redColor].CGColor];
  [gradientLayer addSublayer:rightLayer];

这个渐变层只是一个中间变量,是不能显示出来的,我这里只是演示一下,现在我们已经拿到了渐变层gradientLayer。

第二步

我们需要制作一个环形路径

先看一下效果:

代码实现:

CGPoint center = CGPointMake(100, 100);
  CGFloat radius = 90;
  CGFloat startA = - M_PI_2; //设置进度条起点位置
  CGFloat endA = -M_PI_2 + M_PI * 2 * _progress; //设置进度条终点位置

  //获取环形路径(画一个圆形,填充色透明,设置线框宽度为10,这样就获得了一个环形)
  _progressLayer = [CAShapeLayer layer];//创建一个track shape layer
  _progressLayer.frame = self.bounds;
  _progressLayer.fillColor = [[UIColor clearColor] CGColor]; //填充色为无色
  _progressLayer.strokeColor = [[UIColor redColor] CGColor]; //指定path的渲染颜色,这里可以设置任意不透明颜色
  _progressLayer.opacity = 1; //背景颜色的透明度
  _progressLayer.lineCap = kCALineCapRound;//指定线的边缘是圆的
  _progressLayer.lineWidth = 10;//线的宽度
  UIBezierPath *path = [UIBezierPath bezierPathWithArcCenter:center radius:radius startAngle:startA endAngle:endA clockwise:YES];//上面说明过了用来构建圆形
  _progressLayer.path =[path CGPath]; //把path传递給layer,然后layer会处理相应的渲染,整个逻辑和CoreGraph是一致的。
  [self.layer addSublayer:_progressLayer];

第三步,也是最后一步了

用我们在第二步生成的环形路径去截取第一步生成的渐变层

[gradientLayer setMask:_progressLayer]; //用progressLayer来截取渐变层
self.layer addSublayer:gradientLayer];

截取的layer层就是我们最后需要的,看一看我们最后截取后得到的

到这里,我们已经完成了99%了,最后一步,根据自己的需要让它显示多少的比例就完成了。比例的控制在第二部的progress属性,比例在0-1之间,看一看最后的效果。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习和工作能带来一定的帮助,如果有疑问大家可以留言交流。

(0)

相关推荐

  • Android仿IOS ViewPager滑动进度条

    最近做项目,碰到如下的需求:ViewPager分页,如果是6页(包括6页)就用圆点,如果是6页以上就用进度条来切换.前面一种交互方法最常见,用小圆点来表示当前选中的页面,这些小圆点称为导航点,很多App都是这种实现方式.当用户第一次安装或升级应用时,都会利用导航页面告诉用户当前版本的主要亮点,一般情况下当行页面有三部分组成,背景图片,导航文字和滑动的原点,即下面的效果: 这里就不作详细的讲解,大家可以参考我以前写过的博客: ViewPager实现图片轮翻效果 今天来实现ViewPager进度条切

  • iOS 进度条、加载、安装动画的简单实现

    首先看一下效果图: 下面贴上代码: 控制器ViewController: #import <UIKit/UIKit.h> @interface ViewController : UIViewController @end /*** ---------------分割线--------------- ***/ #import "ViewController.h" #import "HWWaveView.h" #import "HWCircleVi

  • iOS中使用NSProgress类来创建UI进度条的方法详解

    一.引言 在iOS7之前,系统一直没有提供一个完整的框架来描述任务进度相关的功能.这使得在开发中进行耗时任务进度的监听将什么麻烦,在iOS7之后,系统提供了NSProgress类来专门报告任务进度. 二.创建单任务进度监听器 单任务进度的监听是NSProgress最简单的一种运用场景,我们来用定时器模拟一个耗时任务,示例代码如下: @interface ViewController () { NSProgress * progress; } @end @implementation ViewCo

  • IOS实现简单的进度条功能

    本文实例绘制了炫酷的下载进度条,分享给大家供大家参考,具体内容如下 一.实现思路 1.要实现绘图,通常需要自定义一个UIView的子类,重写父类的- (void)drawRect:(CGRect)rect方法,在该方法中实现绘图操作 2.若想显示下载进度,只需要实例化自定义子类的对象(若是storyboard中控件,只需修改控件的class属性为自定义子类的类名即可) 3.效果图所示的效果其实是绘制一个圆弧,动态的改变终点的位置,最终达到一个封闭的圆 4.中间的文字是一个UILabel控件,根据

  • iOS实现带动画的环形进度条

    本篇写的是实现环形进度条,并带动画效果,要实现这些,仅能通过自己画一个 方法直接看代码 为了方便多次调用,用继承UIView的方式 .m文件 #import <UIKit/UIKit.h> @interface LoopProgressView : UIView @property (nonatomic, assign) CGFloat progress; @end .h文件 NSTimer的调用并非精确,可以自行百度 这里因为每0.01s启动一次定时器,所以要同步进度条和数字,就将self.

  • iOS快速实现环形渐变进度条

    前言 进度条相信我们大家都不陌生,往往我们很多时候需要使用到圆形进度条.这篇文章给大家分享了利用iOS如何快速实现环形进度条,下面来一起看看. 一:先制作一个不带颜色渐变的进度条 自定义一个cycleView,在.m 中实现drawRect方法 - (void)drawRect:(CGRect)rect { CGContextRef ctx = UIGraphicsGetCurrentContext();//获取上下文 CGPoint center = CGPointMake(100, 100)

  • JavaScript canvas实现环形渐变进度条

    最近有个需求要做环形渐变色进度条,去网上找了半天没找到合适的,大多数渐变色都是径向渐变,所以自己用canvas写了个环形渐变的图: 这个渐变其实就是把圆环分成许多小块分别绘制的,所以小块分的越多,渐变色越均匀,但是当圆环尺寸比较小的时候,边缘特别毛糙,需要适当减少份数,代码里是用unit 这个变量手动控制的,算是一个缺陷吧. 代码在此: <!DOCTYPE html> <html>     <head>         <style>            

  • Android Canva实现渐变进度条

    目录 前言 前言 标题说渐变进度条是为了方便理解,这里本身的项目背景是一款表盘的分针.先上图: 表盘 周圈蓝色的渐变条(分针)就是本次要实现的东西. 1.拆分 首先,熟悉Canvas的朋友应该知道它可以画出各种形状,但偏偏没有一头是圆的环形(这里不考虑使用path绘制).所以我们不得不把它拆分为2个形状:圆环与圆. 2.绘制圆环 绘制圆环有很多种方法,比如画2个圆取补集之类的.这里直接使用canvas.drawArc()函数来画.先看看函数原型: void drawArc (RectF oval

  • iOS自定义水平滚动条、进度条

    iOS自定义水平滚动条.进度条,继承UIView,可点击轨道.滑动滑块交互. 先看一下效果图: 简单说一下逻辑,新建一个继承UIView的类,分别给轨道.滑块添加UITapGestureRecognizer点击.UIPanGestureRecognizer滑动手势.获取偏移量,计算控件位置,刷新视图. 下面贴上核心代码: 显示视图,在控制器调用代码: HWSlider *slider = [[HWSlider alloc] initWithFrame:CGRectMake(10, 50, 300

  • Android自定义水平渐变进度条

    先看进度条的效果: 具体实现: 新建类,继承自View,在onDraw中进行绘制: import android.content.Context; import android.graphics.Canvas; import android.graphics.LinearGradient; import android.graphics.Paint; import android.graphics.RectF; import android.graphics.Shader; import and

  • android实现圆形渐变进度条

    最近项目中使用到了渐变效果的圆形进度条,网上找了很多渐变效果不够圆滑,两个渐变颜色之间有明显的过渡,或者有些代码画出来的效果过渡不美观,于是自己参照写了一个,喜欢的朋友可以参考或者直接使用. 先上一张效果图,视频录制不太好,不过不影响效果 下面开始介绍实现代码,比较简单,直接贴代码吧 1.声明自定义属性 在项目的valuse文件夹下新建attrs.xml,在里面定义自定义控件需要的属性 <declare-styleable name="RoundProgress"> <

  • Android自定义View实现环形进度条的思路与实例

    前言 前段时间看到了豆瓣FM的音乐播放界面,有一个环形的进度条,非常的好看,于是想了想,为什么不自己做一个呢,于是就开始了自定义的过程 豆瓣FM的播放界面如下图: 功能分析 虽然功能比较简单,但是仍然需要仔细分析 1.图标外还有一圈圆圈,可以设置宽度 2.圆形进度条和进度条底部,可以设置宽度,颜色等 3.内部有一个圆形图片,可旋转 实现思路分析 1.可以设置宽度的圆圈 这个比较容易,直接在onDraw方法中使用canvas绘制即可,当然,在间距和半径的处理上需要仔细,控件本体其实还是一个长方形,

  • IOS绘制动画颜色渐变折线条

    先给大家展示下效果图: 概述 现状 折线图的应用比较广泛,为了增强用户体验,很多应用中都嵌入了折线图.折线图可以更加直观的表示数据的变化.网络上有很多绘制折线图的demo,有的也使用了动画,但是线条颜色渐变的折线图的demo少之又少,甚至可以说没有.该Blog阐述了动画绘制线条颜色渐变的折线图的实现方案,以及折线图线条颜色渐变的实现原理,并附以完整的示例. 成果 本人已将折线图封装到了一个UIView子类中,并提供了相应的接口.该自定义折线图视图,基本上可以适用于大部分需要集成折线图的项目.若你

  • Android自定义带水滴的进度条样式(带渐变色效果)

    一.直接看效果 二.直接上代码 1.自定义控件部分 package com.susan.project.myapplication; import android.app.Activity; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.grap

  • Flutter 实现进度条效果

    用flutter开发的项目,最大的好处除了跨平台之外,还有一点就是插件多,便于很多功能的实现. 画风(话锋)一转,老子说,事物都有两面性,物极必反.插件多是多,插件带来的问题也是不容小觑,总结下,插件带来的几大问题. (1)插件更新不及时 插件更新不及时,会导致我们连编译都过不去,甚至要去改插件的原生代码,这个时候,我们可能会自己创建一个github插件,然后直接引用自己的github插件地址,算了,真不靠谱的插件作者!千言万语尽在不言中... (2)插件冲突 插件冲突,有的时候是配置冲突,比如

随机推荐