iOS学习-圆形进度条
效果:



#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学习-圆形进度条的更多相关文章
- xamarin.ios 实现圆形进度条
using System; using UIKit; using System.Drawing; using CoreAnimation; namespace PMM { public class P ...
- iOS之UI--Quartz2D的入门应用--重绘下载圆形进度条
*:first-child { margin-top: 0 !important; } body > *:last-child { margin-bottom: 0 !important; } ...
- [iOS]圆形进度条及计时功能
平时用战网安全令的时候很喜欢圆形倒计时的效果,然后简单看了一下Android的圆形进度条,后来又写了一个IOS的.整体界面参照IOS系统的倒计时功能,顺便熟悉了UIPickerView的一些特性的实现 ...
- IOS 圆形进度条
// // CCProgressView.h // Demo // // Created by leao on 2017/8/7. // Copyright © 2017年 zaodao. All r ...
- iOS开发笔记-根据frame大小动态调整fontSize的自适应文本及圆形进度条控件的实现
最近同样是新App,设计稿里出现一种圆形进度条的设计,如下: 想了想,圆形进度条实现起来不难,但是其中显示百分比的文本确需要自适应,虽然可以使用时自己设定文本字体的大小,但是这样显得很麻烦,也很low ...
- 利用css3动画和border来实现圆形进度条
最近在学习前端的一些知识,发现border的功能十分强大啊! 首先来看看demo 就是这么一个圆形的进度条,在文本框中输入0-100的数值下面的进度条相应的转到多少 这个主要是利用border,旋转和 ...
- WPF利用动画实现圆形进度条
原文:WPF利用动画实现圆形进度条 这是我的第一篇随笔,最近因为工作需要,开始学习WPF相关技术,自己想实现以下圆形进度条的效果,逛了园子发现基本都是很久以前的文章,实现方式一般都是GDI实现的,想到 ...
- COCOS2D-X之圆形进度条的一个简单Demo
这应该是游戏中很常见的一个效果.显示某个事件的进度等,在加载资源或者联网的时候经常用到.所以有必要学习学习 一.我们直接在COCOS2D-X自带的HelloCpp的工程中添加代码即可.我们在初始化中添 ...
- Android 高手进阶,自己定义圆形进度条
背景介绍 在Android 开发中,我们常常遇到各种各样绚丽的控件,所以,依靠我们Android本身所带的控件是远远不够的,许多时候须要我们自定义控件,在开发的过程中.我们公司遇到了一种须要自己写的一 ...
随机推荐
- jquery禁用文本框
禁用文本框 //文本框禁用 $("input[type='text']").each(function () { $("#" + this.id).attr(& ...
- php调用web service接口(.net开发的接口)
实例代码1: try { $this->soapClientObj = new SoapClient(self::URL . '?wsdl', array('connection_timeout ...
- video/audio在ios/android上播放兼容
1.audio自动播放 <audio src='xxx.mp3' autoplay></audio> 上面是audio标签autoplay属性是自动播放,但是在安卓部分浏览器和 ...
- 时光倒流程序设计-AlloyTicker
熵与负熵 熵遵循熵增原理,即无序非热能与热能之间的转换具有方向性.薛定谔说过:生命本质在于负熵.熵代表的是无序,负熵就是熵的对立,而负熵表示的则是有序.汲取负熵(米饭.面包.牛奶.鸡蛋),可以简单的理 ...
- Android事件分发机制浅谈(三)--源码分析(View篇)
写事件分发源码分析的时候很纠结,网上的许多博文都是先分析的View,后分析ViewGroup.因为我一开始理解的时候是按我的流程图往下走的,感觉方向很对,单是具体分析的时候总是磕磕绊绊的,老要跳到Vi ...
- 静态库介绍与简单演练及同名资源冲突解决(.a格式的静态库)
1.静态库和动态库都是闭源库,不公开源代码. 静态库:.a和.framework 动态库:.dylib和.framework(iOS9取消了.dylib,使用.tbd替代) 2.静态库和动态库在使用上 ...
- IOS-小项目(饿了么 网络部分 简单实现)
在介绍小项目之前,在此说明一下此代码并非本人所写,我只是随笔的整理者. 在介绍之前先展现一下效果图. 看过效果图大家应该很熟悉了,就是饿了么的一个界面而已,值得注意的是,实现时并没有采用本地连接,而是 ...
- django 第二天 制作小demo
创建虚拟目录 mkdir ~/virtualenvs mkdir ~/virtualenvs/myprojectenv virtualenv ~/virtualenvs/myprojectenv 激活 ...
- 【转】浅谈JavaScript、ES5、ES6
什么是JavaScript JavaScript一种动态类型.弱类型.基于原型的客户端脚本语言,用来给HTML网页增加动态功能.(好吧,概念什么最讨厌了) 动态: 在运行时确定数据类型.变量使用之前不 ...
- 关于 IIS 中 Excel 访问的问题
关于 IIS 上 Excel 文件的访问, 一路上困难重重, 最后按以下步骤进行设置, 可在 IIS 中正常使用! 1. 引用及代码: 1). 项目中添加 Excel 程序集引用(注意: 从系统 CO ...