iOS实现圆环比例图

本文实例为大家分享了iOS实现圆环比例图的具体代码,供大家参考,具体内容如下

实现效果

实现方法

1. SSTCircleProgressView

@interface SSTCircleProgressView : UIView
/**
 *进度条的角的类型
 */
@property (nonatomic,copy) CAShapeLayerLineCap lineCap;

/**
 *进度条显示的文字
 */
@property (nonatomic,copy) NSString *progressLabelText;

/**
 *进度条显示的文字的颜色
 */
@property (nonatomic,copy) UIColor *progressLabelTextColor;

/**
 *进度条宽度
 */
@property (nonatomic,assign) CGFloat progressLineWidth;
/**
 * 背景线条宽度
 */
@property (nonatomic,assign) CGFloat backgroundLineWidth;
/**
 * 进度百分比
 */
@property (nonatomic,assign) CGFloat percentage;
/**
 * 背景填充颜色
 */
@property (nonatomic,strong) UIColor *backgroundStrokeColor;
/**
 * 进度条填充颜色
 */
@property (nonatomic,strong) UIColor *progressStrokeColor;
/**
 * 距离边框边距偏移量
 */
@property (nonatomic,assign) CGFloat offset;

- (void)setProgress:(CGFloat)percentage animated:(BOOL)animated;

@end
#import "SSTCircleProgressView.h"

#define kDuration 1.0
#define kDefaultLineWidth 10

@interface SSTCircleProgressView()

@property (nonatomic,strong) CAShapeLayer *backgroundLayer;
@property (nonatomic,strong) CAShapeLayer *progressLayer;
@property (nonatomic,strong) UILabel *progressLabel;
@property (nonatomic,strong) NSTimer *timer;
@property (nonatomic,assign) CGFloat startAngle ; // M_PI*2
@property (nonatomic,assign) CGFloat endAngle ;

@end

@implementation SSTCircleProgressView

- (instancetype)initWithFrame:(CGRect)frame
{
  self = [super initWithFrame:frame];
  if (self) {
    [self setBackgroundColor:[UIColor clearColor]];
    [self createSubViews];
    //init default variable
    self.backgroundLineWidth = kDefaultLineWidth;
    self.progressLineWidth = kDefaultLineWidth;
    self.percentage = 0;
    self.offset = 0;
    self.startAngle = -M_PI_2;
    self.endAngle = 0;
  }
  return self;
}

- (void)createSubViews
{
  //self.progressLabel.text = @"0%";
  self.progressLabel.textAlignment = NSTextAlignmentCenter;
  self.progressLabel.font = FONTBOLD(12);
  [self addSubview:self.progressLabel];

  _backgroundLayer = [CAShapeLayer layer];
  _backgroundLayer.frame = self.bounds;
  _backgroundLayer.fillColor = nil;
  _backgroundLayer.strokeColor = [UIColor lightGrayColor].CGColor;

  _progressLayer = [CAShapeLayer layer];
  _progressLayer.frame = self.bounds;
  _progressLayer.fillColor = nil;
  _progressLayer.strokeColor = [UIColor redColor].CGColor;

  [self.layer addSublayer:_backgroundLayer];
  [self.layer addSublayer:_progressLayer];
}

-(void)setProgressLabelText:(NSString *)progressLabelText{
  _progressLabelText = progressLabelText;
  self.progressLabel.text = progressLabelText;
}

-(void)setProgressLabelTextColor:(UIColor *)progressLabelTextColor{
  _progressLabelTextColor = progressLabelTextColor;
  self.progressLabel.textColor = progressLabelTextColor;
}

#pragma mark - Draw CircleLine
- (void)setBackgroundCircleLine
{
  UIBezierPath *path = [UIBezierPath bezierPath];
  path = [UIBezierPath bezierPathWithArcCenter:CGPointMake(self.center.x - self.frame.origin.x, self.center.y - self.frame.origin.y)
                     radius:(self.frame.size.width - _backgroundLineWidth)/2 - _offset
                   startAngle:self.startAngle
                    endAngle:self.endAngle
                    clockwise:NO];
  _backgroundLayer.path = path.CGPath;
}

- (void)setProgressCircleLine
{
  UIBezierPath *path = [UIBezierPath bezierPath];
  path = [UIBezierPath bezierPathWithArcCenter:CGPointMake(self.center.x - self.frame.origin.x, self.center.y - self.frame.origin.y)
                     radius:(self.frame.size.width - _progressLineWidth)/2 - _offset
                   startAngle:self.startAngle
                    endAngle:self.endAngle
                    clockwise:NO];
  _progressLayer.path = path.CGPath;
}

#pragma mark - Lazy Load
- (UILabel *)progressLabel
{
  if (!_progressLabel) {
    _progressLabel = [[UILabel alloc]initWithFrame:CGRectMake((self.bounds.size.width -100)/2, (self.bounds.size.height - 100)/2, 100, 100)];
  }
  return _progressLabel;
}

- (void)setBackgroundLineWidth:(CGFloat)backgroundLineWidth
{
  _backgroundLineWidth = backgroundLineWidth;
  _backgroundLayer.lineWidth = _backgroundLineWidth;
  [self setBackgroundCircleLine];
}

-(void)setLineCap:(CAShapeLayerLineCap)lineCap{
  _progressLayer.lineCap = lineCap;
  [self setProgressCircleLine];
}

- (void)setProgressLineWidth:(CGFloat)progressLineWidth
{
  _progressLineWidth = progressLineWidth;
  _progressLayer.lineWidth = _progressLineWidth;
  [self setProgressCircleLine];
}

- (void)setPercentage:(CGFloat)percentage {
  _percentage = percentage;
}

- (void)setBackgroundStrokeColor:(UIColor *)backgroundStrokeColor {
  _backgroundStrokeColor = backgroundStrokeColor;
  _backgroundLayer.strokeColor = _backgroundStrokeColor.CGColor;
}

- (void)setProgressStrokeColor:(UIColor *)progressStrokeColor
{
  _progressStrokeColor = progressStrokeColor;
  _progressLayer.strokeColor = _progressStrokeColor.CGColor;
}

#pragma mark - progress animated YES or NO
- (void)setProgress:(CGFloat)percentage animated:(BOOL)animated
{
  self.percentage = percentage;
  _progressLayer.strokeEnd = _percentage;
  if (animated) {
    CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"strokeEnd"];
    animation.fromValue = [NSNumber numberWithFloat:0.0];
    animation.toValue = [NSNumber numberWithFloat:_percentage];
    animation.duration = kDuration;
    [_progressLayer addAnimation:animation forKey:@"strokeEndAnimation"];
  }else{
    [CATransaction begin];
    [CATransaction setDisableActions:YES];
    _progressLabel.text = [NSString stringWithFormat:@"%.0f%%",_percentage*100];
    [CATransaction commit];
  }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • iOS实现比例拼图的方法示例

    需求原型图: 要求: 各个模块的大小反映各个模块的占比(销售额),所有模块共同组成一个正方形. 后台返回的数据格式: { "result": true, "data": { "category_sale": [ { "name": "我是你的哥", "sale_amount": 1, "gross_margin_ratio": 0.22 }, { "name

  • iOS实现圆环比例图

    本文实例为大家分享了iOS实现圆环比例图的具体代码,供大家参考,具体内容如下 实现效果 实现方法 1. SSTCircleProgressView @interface SSTCircleProgressView : UIView /** *进度条的角的类型 */ @property (nonatomic,copy) CAShapeLayerLineCap lineCap; /** *进度条显示的文字 */ @property (nonatomic,copy) NSString *progres

  • iOS渐变圆环旋转动画CAShapeLayer CAGradientLayer

    iOS渐变圆环旋转动画CAShapeLayer CAGradientLayer shape.gif demo.png - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. CALayer *layer = [CALayer layer]; layer.backgroundColor = [UIColor redColor

  • vue.js实现仿原生ios时间选择组件实例代码

    前言 最近几个月一直在看VUE,然后试着只用原生js+vue实现某些组件. PC端时间选择组件 这是最开始实现的pc上的时间选择,平时移动端也在做,所以就想实现一下移动端的时间选择器,下面分享一下我实现移动端滚轮特效时间选择器的思路和过程.整个组件是基于vue-cli来进行构建的 功能 1.时间选择[ A.年月日选择 B.年月日小时分钟选择 C.小时分钟选择 D.分钟选择] 2.滚轮效果[ A.构成一个圆环首尾相连 B.不构成首尾相连] 3.时间选择范围设置(所选时间超过范围将弹窗提示),分钟间

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

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

  • Android自定义View仿IOS圆盘时间选择器

    通过自定义view实现仿iOS实现滑动两端的点选择时间的效果 效果图 自定义的view代码 public class Ring_Slide2 extends View { private static final double RADIAN = 180 / Math.PI; private int max_progress; // 设置最大进度 private int cur_progress; //设置锚点1当前进度 private int cur_progress2; //设置锚点2进度 p

  • vue 实现 ios 原生picker 效果及实现思路解析

    以前最早实现了一个类似的时间选择插件,但是适用范围太窄,索性最近要把这个实现方式发布出来,就重写了一个高复用的vue组件. 支持安卓4.0以上,safari 7以上 效果预览 gitHub 滚轮部分主要dom结构 <template data-filtered="filtered"> <div class="pd-select-item"> <div class="pd-select-line"></di

  • iOS实现抖音点赞动画效果

    本文实例为大家分享了iOS实现抖音点赞动画的具体代码,供大家参考,具体内容如下 1. 概述 最近看到抖音点赞爱心的动画效果比较好,出于好奇,自己也研究仿照动画效果写了一个,不喜欢的朋友可不要喷我噢!!! 话不多说,先来看一下执行效果. 2. 动画分析 上面的示例效果有点快,现在来看一个慢的,然后在分析动画组成. 这回看清楚了吧,哈哈. 2.1 动画过程分析 咱们就以10秒的点赞动画来分析一下: 点赞的时候: 1.点击的时候,白色爱心逐渐变小到一定程度,然后变成红色爱心.(3秒) 2.红色爱心慢慢

  • C++图形界面开发Qt教程:嵌套圆环示例

    目录 嵌套圆环图 运行示例 总结 Qt是一个跨平台框架,通常用作图形工具包,它不仅创建CLI应用程序中非常有用.而且它也可以在三种主要的台式机操作系统以及移动操作系统(如Symbian,Nokia Belle,Meego Harmattan,MeeGo或BB10)以及嵌入式设备,Android(Necessitas)和iOS的端口上运行.现在我们为你提供了免费的试用版. Qt组件推荐: QtitanRibbon| 下载试用: 遵循Microsoft Ribbon UI Paradigm for

  • iOS动画解析之圆球加载动画XLBallLoading的实现

    前言 当网页的页面大小较大,用户加载可能需要较长的时间,在这些情况下,我们一般会用到(加载)loading动画,提示于用户页面在加载中,本文将详细给大家介绍关于iOS圆球加载动画XLBallLoading实现的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧. 一.显示效果 二.原理分析 1.拆解动画 从效果图来看,动画可拆解成两部分:放大动画.位移动画 放大动画 比较简单,这里主要来分析一下位移动画 (1).先去掉缩放效果: 屏蔽放大效果 (2).去掉其中的一个圆球 现

  • iOS动画解析之支付宝支付打钩动画的实现方法

    前言 我们平时在用支付宝付款时,会有一个支付中的动画和一个支付完成的动画.这篇博客主要分析一下这种动画效果,效果如下: 支付宝支付动画 一.动画解析 为了方便观察,放慢了动画的速度并添加辅助线: 放慢后的动画 从图中可以看出:加载圆弧运动轨迹可分为前半段和后半段:并且圆弧的起始角度(StartAngle)和结束角度(EndAngle)在做有规律的变化: 前半段: 从-0.5π到π,这一段运动中速度较快:StartAngle不变,始终未-0.5π:EndAngle在匀速上升,一直到π:前半段中圆弧

随机推荐