效果:

#import <UIKit/UIKit.h>

@interface HsProfitRatePieWidgets : UIView
{
UILabel *_textLabel;
} @property (nonatomic) double progress; @property (nonatomic) NSInteger showText UI_APPEARANCE_SELECTOR;
@property (nonatomic) NSInteger roundedHead UI_APPEARANCE_SELECTOR;
@property (nonatomic) NSInteger showShadow UI_APPEARANCE_SELECTOR; @property (nonatomic) CGFloat thicknessRatio UI_APPEARANCE_SELECTOR; @property (nonatomic, strong) UIColor *innerBackgroundColor UI_APPEARANCE_SELECTOR;
@property (nonatomic, strong) UIColor *outerBackgroundColor UI_APPEARANCE_SELECTOR; @property (nonatomic, strong) UIFont *font UI_APPEARANCE_SELECTOR; @property (nonatomic, strong) UIColor *progressFillColor UI_APPEARANCE_SELECTOR; @property (nonatomic, strong) UIColor *progressTopGradientColor UI_APPEARANCE_SELECTOR;
@property (nonatomic, strong) UIColor *progressBottomGradientColor UI_APPEARANCE_SELECTOR; @end

.m实现文件中

#import "HsProfitRatePieWidgets.h"

#define DEGREES_TO_RADIANS(angle) ((angle) / 180.0 * M_PI)

@implementation HsProfitRatePieWidgets

- (void)dealloc
{
[_textLabel release];
[super dealloc];
} + (void)initialize
{
if (self == [HsProfitRatePieWidgets class])
{
id appearance = [self appearance]; [appearance setShowText:YES];//用来控制是否显示显示label
[appearance setRoundedHead:YES];//用来控制是否对进度两边进行处理
[appearance setShowShadow:YES];//控制圆环进度条的样式 [appearance setThicknessRatio:0.37f];//圆环进度条的宽度 [appearance setInnerBackgroundColor:nil];
[appearance setOuterBackgroundColor:nil]; [appearance setProgressFillColor:[UIColor redColor]];//整个进度条颜色
[appearance setProgressTopGradientColor:[UIColor greenColor]];//进度条前半部分颜色
[appearance setProgressBottomGradientColor:[UIColor redColor]];//进度条后半部分颜色
[appearance setBackgroundColor:[UIColor clearColor]];
}
} - (id)init
{
self = [super initWithFrame:CGRectMake(0.0f, 0.0f, 44.0f, 44.0f)]; return self;
} #pragma mark - Drawing - (void)drawRect:(CGRect)rect
{
// Calculate position of the circle
CGFloat progressAngle = _progress * 360.0 - ;
CGPoint center = CGPointMake(rect.size.width / 2.0f, rect.size.height / 2.0f);
CGFloat radius = MIN(rect.size.width, rect.size.height) / 2.0f; CGRect square;
if (rect.size.width > rect.size.height)
{
square = CGRectMake((rect.size.width - rect.size.height) / 2.0, 0.0, rect.size.height, rect.size.height);
}
else
{
square = CGRectMake(0.0, (rect.size.height - rect.size.width) / 2.0, rect.size.width, rect.size.width);
} //进度条宽度
CGFloat circleWidth = radius * _thicknessRatio;
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSaveGState(context); if (_innerBackgroundColor)
{
//内环
// Fill innerCircle with innerBackgroundColor
UIBezierPath *innerCircle = [UIBezierPath bezierPathWithArcCenter:center
radius:radius - circleWidth
startAngle:*M_PI
endAngle:0.0
clockwise:YES]; [_innerBackgroundColor setFill]; [innerCircle fill];
} if (_outerBackgroundColor)
{
//外环
// Fill outerCircle with outerBackgroundColor
UIBezierPath *outerCircle = [UIBezierPath bezierPathWithArcCenter:center
radius:radius
startAngle:0.0
endAngle:*M_PI
clockwise:NO];
[outerCircle addArcWithCenter:center
radius:radius - circleWidth
startAngle:*M_PI
endAngle:0.0
clockwise:YES]; [_outerBackgroundColor setFill]; [outerCircle fill];
} if (_showShadow)
{
//圆环背景处理
CGFloat locations[] = { 0.0f, 0.33f, 0.66f, 1.0f };
// NSArray *gradientColors = @[
// (id)[[UIColor colorWithWhite:0.3 alpha:0.5] CGColor],
// (id)[[UIColor colorWithWhite:0.9 alpha:0.0] CGColor],
// (id)[[UIColor colorWithWhite:0.9 alpha:0.0] CGColor],
// (id)[[UIColor colorWithWhite:0.3 alpha:0.5] CGColor],
// ]; NSArray *gradientColors = @[
(id)[[UIColor colorWithWhite:0.7 alpha:] CGColor],
(id)[[UIColor colorWithWhite:0.7 alpha:] CGColor],
(id)[[UIColor colorWithWhite:0.7 alpha:] CGColor],
(id)[[UIColor colorWithWhite:0.7 alpha:] CGColor],
]; CGColorSpaceRef rgb = CGColorSpaceCreateDeviceRGB();
CGGradientRef gradient = CGGradientCreateWithColors(rgb, (__bridge CFArrayRef)gradientColors, locations);
CGContextDrawRadialGradient(context, gradient, center, radius - circleWidth, center, radius, );
CGGradientRelease(gradient);
CGColorSpaceRelease(rgb);
} if (_showText)
{
if (!_progress) {
return;
}
if ([self viewWithTag:]) {
[_textLabel removeFromSuperview];
}
//中间显示label
_textLabel = [[[UILabel alloc] init] autorelease];
//字符串处理
NSString *str = [NSString stringWithFormat:@"%0.2f%%\n收益率",_progress * 100.0];
NSMutableAttributedString *progressStr = [[NSMutableAttributedString alloc] initWithString:str];
//前6位字符 颜色
[progressStr addAttribute:NSForegroundColorAttributeName value:[UIColor redColor] range:NSMakeRange(, )];
//第七位向后的3个字符 颜色
[progressStr addAttribute:NSForegroundColorAttributeName value:[UIColor blackColor] range:NSMakeRange(, )];
[progressStr addAttribute:NSFontAttributeName value:[UIFont boldSystemFontOfSize:16.0] range:NSMakeRange(, )];
[progressStr addAttribute:NSFontAttributeName value:[UIFont systemFontOfSize:] range:NSMakeRange(, )];
_textLabel.attributedText = progressStr;
_textLabel.numberOfLines = ;
_textLabel.bounds = CGRectMake(, , , );
_textLabel.center = CGPointMake(self.bounds.size.width/2.0, self.bounds.size.height/2.0);
_textLabel.tag = ;
_textLabel.textAlignment = NSTextAlignmentCenter;
[self addSubview:_textLabel]; } UIBezierPath *path = [UIBezierPath bezierPath]; [path appendPath:[UIBezierPath bezierPathWithArcCenter:center
radius:radius
startAngle:DEGREES_TO_RADIANS(-)
endAngle:DEGREES_TO_RADIANS(progressAngle)
clockwise:YES]]; if (_roundedHead)
{
//终点处理
CGPoint point;
point.x = (cos(DEGREES_TO_RADIANS(progressAngle)) * (radius - circleWidth/)) + center.x;
point.y = (sin(DEGREES_TO_RADIANS(progressAngle)) * (radius - circleWidth/)) + center.y; [path addArcWithCenter:point
radius:circleWidth/
startAngle:DEGREES_TO_RADIANS(progressAngle)
endAngle:DEGREES_TO_RADIANS(270.0 + progressAngle - 90.0)
clockwise:YES];
} [path addArcWithCenter:center
radius:radius-circleWidth
startAngle:DEGREES_TO_RADIANS(progressAngle)
endAngle:DEGREES_TO_RADIANS(-)
clockwise:NO];
//起始点添加分割线
UIView *lineView = [[UIView alloc] initWithFrame:CGRectMake(radius, , , circleWidth)];
lineView.backgroundColor = [UIColor whiteColor];
[self addSubview:lineView]; if (_roundedHead)
{
//起始点处理
// CGPoint point;
// point.x = (cos(DEGREES_TO_RADIANS(-90)) * (radius - circleWidth/2)) + center.x;
// point.y = (sin(DEGREES_TO_RADIANS(-90)) * (radius - circleWidth/2)) + center.y;
//
// [path addArcWithCenter:point
// radius:circleWidth/2
// startAngle:DEGREES_TO_RADIANS(90)
// endAngle:DEGREES_TO_RADIANS(-90)
// clockwise:NO];
} [path closePath];
//进度条颜色处理
if (_progressFillColor)
{
[_progressFillColor setFill];
[path fill];
}
else if (_progressTopGradientColor && _progressBottomGradientColor)
{
[path addClip]; NSArray *backgroundColors = @[
(id)[_progressTopGradientColor CGColor],
(id)[_progressBottomGradientColor CGColor],
];
CGFloat backgroudColorLocations[] = { 0.0f, 1.0f };
CGColorSpaceRef rgb = CGColorSpaceCreateDeviceRGB();
CGGradientRef backgroundGradient = CGGradientCreateWithColors(rgb, (__bridge CFArrayRef)(backgroundColors), backgroudColorLocations);
CGContextDrawLinearGradient(context,
backgroundGradient,
CGPointMake(0.0f, square.origin.y),
CGPointMake(0.0f, square.size.height),
);
CGGradientRelease(backgroundGradient);
CGColorSpaceRelease(rgb);
} CGContextRestoreGState(context);
} #pragma mark - Setter
//设置进度
- (void)setProgress:(double)progress
{
_progress = MIN(1.0, MAX(0.0, progress)); [self setNeedsDisplay];
} #pragma mark - UIAppearance - (void)setShowText:(NSInteger)showText
{
_showText = showText; [self setNeedsDisplay];
} - (void)setRoundedHead:(NSInteger)roundedHead
{
_roundedHead = roundedHead; [self setNeedsDisplay];
} - (void)setShowShadow:(NSInteger)showShadow
{
_showShadow = showShadow; [self setNeedsDisplay];
}
//进度条宽度与半径之比
- (void)setThicknessRatio:(CGFloat)thickness
{
_thicknessRatio = MIN(MAX(0.0f, thickness), 1.0f); [self setNeedsDisplay];
}
//内环
- (void)setInnerBackgroundColor:(UIColor *)innerBackgroundColor
{
_innerBackgroundColor = innerBackgroundColor; [self setNeedsDisplay];
}
//外环
- (void)setOuterBackgroundColor:(UIColor *)outerBackgroundColor
{
_outerBackgroundColor = outerBackgroundColor; [self setNeedsDisplay];
}
//进度条颜色
- (void)setProgressFillColor:(UIColor *)progressFillColor
{
_progressFillColor = progressFillColor; [self setNeedsDisplay];
}
//进度条前半部分颜色
- (void)setProgressTopGradientColor:(UIColor *)progressTopGradientColor
{
_progressTopGradientColor = progressTopGradientColor; [self setNeedsDisplay];
}
//进度条后半部分颜色
- (void)setProgressBottomGradientColor:(UIColor *)progressBottomGradientColor
{
_progressBottomGradientColor = progressBottomGradientColor; [self setNeedsDisplay];
} @end

展现:

- (void)viewDidLoad {
[super viewDidLoad];
HsProfitRatePieWidgets *circleProgress = [[HsProfitRatePieWidgets alloc] initWithFrame:CGRectMake(, , , )];
circleProgress.progress = 0.432;
[self.view addSubview:circleProgress];
[circleProgress release];
}

iOS学习-圆形进度条的更多相关文章

  1. xamarin.ios 实现圆形进度条

    using System; using UIKit; using System.Drawing; using CoreAnimation; namespace PMM { public class P ...

  2. iOS之UI--Quartz2D的入门应用--重绘下载圆形进度条

    *:first-child { margin-top: 0 !important; } body > *:last-child { margin-bottom: 0 !important; } ...

  3. [iOS]圆形进度条及计时功能

    平时用战网安全令的时候很喜欢圆形倒计时的效果,然后简单看了一下Android的圆形进度条,后来又写了一个IOS的.整体界面参照IOS系统的倒计时功能,顺便熟悉了UIPickerView的一些特性的实现 ...

  4. IOS 圆形进度条

    // // CCProgressView.h // Demo // // Created by leao on 2017/8/7. // Copyright © 2017年 zaodao. All r ...

  5. iOS开发笔记-根据frame大小动态调整fontSize的自适应文本及圆形进度条控件的实现

    最近同样是新App,设计稿里出现一种圆形进度条的设计,如下: 想了想,圆形进度条实现起来不难,但是其中显示百分比的文本确需要自适应,虽然可以使用时自己设定文本字体的大小,但是这样显得很麻烦,也很low ...

  6. 利用css3动画和border来实现圆形进度条

    最近在学习前端的一些知识,发现border的功能十分强大啊! 首先来看看demo 就是这么一个圆形的进度条,在文本框中输入0-100的数值下面的进度条相应的转到多少 这个主要是利用border,旋转和 ...

  7. WPF利用动画实现圆形进度条

    原文:WPF利用动画实现圆形进度条 这是我的第一篇随笔,最近因为工作需要,开始学习WPF相关技术,自己想实现以下圆形进度条的效果,逛了园子发现基本都是很久以前的文章,实现方式一般都是GDI实现的,想到 ...

  8. COCOS2D-X之圆形进度条的一个简单Demo

    这应该是游戏中很常见的一个效果.显示某个事件的进度等,在加载资源或者联网的时候经常用到.所以有必要学习学习 一.我们直接在COCOS2D-X自带的HelloCpp的工程中添加代码即可.我们在初始化中添 ...

  9. Android 高手进阶,自己定义圆形进度条

    背景介绍 在Android 开发中,我们常常遇到各种各样绚丽的控件,所以,依靠我们Android本身所带的控件是远远不够的,许多时候须要我们自定义控件,在开发的过程中.我们公司遇到了一种须要自己写的一 ...

随机推荐

  1. .NET 实现并行的几种方式(四)

    本随笔续接:.NET 实现并行的几种方式(三) 八.await.async - 异步方法的秘密武器 1) 使用async修饰符 和 await运算符 轻易实现异步方法 前三篇随笔已经介绍了多种方式.利 ...

  2. JAVA 日期格式工具类DateUtil.java

    DateUtil.java package pers.kangxu.datautils.utils; import java.text.SimpleDateFormat; import java.ut ...

  3. JAVA Thread线程异常监控

    一.场景描述:单线程程序可以用try...catch捕获程序的异常,而在多线程程序的时候是无法使用try...catch捕获. 示例1:多线程发生异常,无法使用try...catch捕获问题 publ ...

  4. 两种常用的C语言排序算法

    1. 要求输入10个整数,从大到小排序输出 输入:2 0 3 -4 8 9 5 1 7 6 输出:9 8 7 6 5 3 2 1 0 -4 解决方法:选择排序法 实现代码如下: #include &l ...

  5. 关于MySql的1045错误修正

    很多情况数据库很久没有使用,偶尔打开会出现一系列错误,例如1045错误即是 mysql ERROR 1045 : Access denied for user‘root’@localhost(usin ...

  6. 关于mysql 和Oracle的一大堆麻烦问题的解决方案

    [INS-20802] Oracle Net Configuration Assistant 失败 在百度上找了半天并没有找到可靠的解决方案,最后是可以安装完成的,之后我 通过SQL Plus连接就报 ...

  7. linux的基本语法及一些设置

    rm -r note.txt //delete网络配置进入 vi /etc/sysconfig/network-scripts/ifcfg-teh0修改配置DEVICE=eth0BOOTPROTO=d ...

  8. HTML+CSS项目开发总结

    好几天没更新博客了,刚实战完一个HTML+CSS的简单项目.经过几天的摸索,发现收益良多.之前只是单纯得写demo,看知识点,没有亲自实战项目.但实战过后才会了解,如何才能更好地提升自己的技术.针对这 ...

  9. 用java单例模式实现面板切换

    1.首先介绍一下什么是单例模式: java单例模式是一种常见的设计模式,那么我们先看看懒汉模式: public class Singleton_ { //设为私有方法,防止被外部类引用或实例 priv ...

  10. android:布局、绘制、内存泄露、响应速度、listview和bitmap、线程优化以及一些优化的建议!

    1.布局优化 首先删除布局中无用的控件和层级,其次有选择地使用性能较低的viewgroup,比如布局中既可以使用RelativeLayout和LinearLayout,那我们就采用LinearLayo ...