iOS - Quartz 2D 下载进度按钮绘制
1、绘制下载进度按钮
具体实现代码见 GitHub 源码 QExtension
QProgressButton.h
@interface QProgressButton : UIButton /// 进度值,范围 0 ~ 1
@property (nonatomic, assign) CGFloat progress; /// 进度终止状态标题,一旦设置了此标题进度条就会停止
@property (nonatomic, strong) NSString *stopTitle; /**
* 创建带进度条的按钮
*
* @param frame 按钮的 frame 值
* @param title 进按钮的标题
* @param lineWidth 进度条的线宽,default is 2
* @param lineColor 进度条线的颜色,default is greenColor
* @param textColor 进度值的颜色,default is blackColor
* @param backColor 按钮的背景颜色,default is clearColor
* @param isRound 按钮是否显示为圆形,default is YES
*
* @return 带进度条的按钮
*/
+ (instancetype)q_progressButtonWithFrame:(CGRect)frame
title:(NSString *)title
lineWidth:(CGFloat)lineWidth
lineColor:(nullable UIColor *)lineColor
textColor:(nullable UIColor *)textColor
backColor:(nullable UIColor *)backColor
isRound:(BOOL)isRound; @end
QProgressButton.m
@interface QProgressButton () /// 进度条的线宽
@property (nonatomic, assign) CGFloat lineWidth; /// 进度条线的颜色
@property (nonatomic, strong) UIColor *lineColor; /// 按钮的背景颜色
@property (nonatomic, strong) UIColor *backColor; /// 按钮是否显示为圆形
@property (nonatomic, assign, getter=isRound) BOOL round; @end @implementation QProgressButton /// 创建带进度条的按钮
+ (instancetype)q_progressButtonWithFrame:(CGRect)frame
title:(NSString *)title
lineWidth:(CGFloat)lineWidth
lineColor:(nullable UIColor *)lineColor
textColor:(nullable UIColor *)textColor
backColor:(nullable UIColor *)backColor
isRound:(BOOL)isRound { QProgressButton *progressButton = [[self alloc] init]; progressButton.lineWidth = lineWidth ? : 2;
progressButton.lineColor = lineColor ? : [UIColor colorWithRed:76/255.0 green:217/255.0 blue:100/255.0 alpha:1.0];
progressButton.backColor = backColor ? : [UIColor clearColor];
progressButton.round = isRound; // 设置按钮的实际 frame
if (isRound) {
CGRect tmpFrame = frame;
tmpFrame.origin.y = frame.origin.y - (frame.size.width - frame.size.height) * 0.5;
tmpFrame.size.height = frame.size.width;
progressButton.frame = tmpFrame;
} else {
progressButton.frame = frame;
} // 设置显示的标题和颜色
[progressButton setTitle:title forState:UIControlStateNormal];
[progressButton setTitleColor:(textColor ? : [UIColor blackColor]) forState:UIControlStateNormal]; return progressButton;
} /// 绘制进度条
- (void)drawRect:(CGRect)rect { // 设置按钮圆角
self.layer.masksToBounds = YES;
self.layer.cornerRadius = rect.size.height * 0.5; // 绘制按钮的背景颜色
UIBezierPath *path = [UIBezierPath bezierPathWithRect:rect];
[self.backColor set];
[path fill]; // 设置进度终止时显示的内容
if (self.stopTitle) { // 设置下载完成后的标题
[self setTitle:self.stopTitle forState:UIControlStateNormal];
return;
} if (self.progress <= 0) {
return;
} // 清除按钮背景图片
[self setBackgroundImage:nil forState:UIControlStateNormal]; // 设置进度值
[self setTitle:[NSString stringWithFormat:@"%.2f%%", self.progress * 100] forState:UIControlStateNormal]; if (self.isRound) { CGPoint center = CGPointMake(rect.size.height * 0.5, rect.size.height * 0.5);
CGFloat radius = (rect.size.height - self.lineWidth) * 0.5;
CGFloat startA = - M_PI_2;
CGFloat endA = startA + self.progress * 2 * M_PI; // 绘制进度条背景
path = [UIBezierPath bezierPathWithArcCenter:center
radius:radius
startAngle:0
endAngle:2 * M_PI
clockwise:YES];
[[[UIColor lightGrayColor] colorWithAlphaComponent:0.5] set];
path.lineWidth = self.lineWidth;
[path stroke]; // 绘制进度条
path = [UIBezierPath bezierPathWithArcCenter:center
radius:radius
startAngle:startA
endAngle:endA
clockwise:YES];
path.lineWidth = self.lineWidth;
path.lineCapStyle = kCGLineCapRound;
[self.lineColor set];
[path stroke]; } else { CGFloat w = self.progress * rect.size.width;
CGFloat h = rect.size.height; // 绘制进度条背景
path = [UIBezierPath bezierPathWithRect:CGRectMake(0, 0, rect.size.width, rect.size.height)];
[[[UIColor lightGrayColor] colorWithAlphaComponent:0.5] set];
[path fill]; // 绘制进度条
path = [UIBezierPath bezierPathWithRect:CGRectMake(0, 0, w, h)];
[self.lineColor set];
[path fill];
}
} /// 设置进度值
- (void)setProgress:(CGFloat)progress { _progress = progress; [self setNeedsDisplay];
} /// 设置进度终止状态标题
- (void)setStopTitle:(NSString *)stopTitle { _stopTitle = stopTitle; [self setNeedsDisplay];
} @end
ViewController.m
// 创建进度按钮
QProgressButton *progressButton = [QProgressButton q_progressButtonWithFrame:CGRectMake(100, 100, 100, 50)
title:@"开始下载"
lineWidth:10
lineColor:[UIColor blueColor]
textColor:[UIColor redColor]
backColor:[UIColor yellowColor]
isRound:YES]; // 设置按钮点击事件
[progressButton addTarget:self action:@selector(progressUpdate:) forControlEvents:UIControlEventTouchUpInside]; // 将按钮添加到当前控件显示
[self.view addSubview:progressButton]; // 设置按钮的进度值
self.progressButton.progress = progress; // 设置按钮的进度终止标题,一旦设置了此标题进度条就会停止
self.progressButton.stopTitle = @"下载完成";
效果


iOS - Quartz 2D 下载进度按钮绘制的更多相关文章
- iOS - Quartz 2D 第三方框架 Charts 绘制图表
1.Charts 简介 使用第三方框架 Charts 绘制 iOS 图表.GitHub 源码 Charts Charts 是一款用于绘制图表的框架,可以绘制柱状图.折线图.K线图.饼状图等.Chart ...
- iOS - Quartz 2D 手势截屏绘制
1.绘制手势截屏 具体实现代码见 GitHub 源码 QExtension QTouchClipView.h @interface QTouchClipView : UIView /** * 创建手势 ...
- iOS - Quartz 2D 二维绘图
1.Quartz 2D 简介 Quartz 2D 属于 Core Graphics(所以大多数相关方法的都是以 CG 开头),是 iOS/Mac OSX 提供的在内核之上的强大的 2D 绘图引擎,并且 ...
- iOS - Quartz 2D 贝塞尔曲线
1.贝塞尔曲线 贝塞尔曲线(Bézier curve),又称贝兹曲线或贝济埃曲线,是应用于二维图形应用程序的数学曲线.一般的矢量图形软件通过它来精确画出曲线,贝兹曲线由线段与节点组成,节点是可拖动的支 ...
- iOS空心圆下载进度指示器控件
self.layer = [CAShapeLayer layer]; self.layer.frame = CGRectMake(, , , ); self.layer.position = self ...
- iOS - Quartz 2D 画板绘制
1.绘制画板 1.1 绘制简单画板 PaintBoardView.h @interface PaintBoardView : UIView @end PaintBoardView.m @interfa ...
- IOS Quartz 2D 学习(1)
IOS提供两种创建图形的途径: 1.OpenGL. 2.Quartz.Core Animation.UIKit图形支持. UIKit的图形系统 1.视图绘画周期: DrawRect方法,在任何时候,当 ...
- iOS开发——图层OC篇&Quartz 2D各种绘制实例
Quartz 2D各种绘制实例 首先说一下,本篇文章只是介绍怎么使用Quartz 2D绘制一些常用的图像效果,关于Quartz和其他相关技术请查看笔者之前写的完整版(Quartz 2D详解) 一:画线 ...
- iOS 2D绘图 (Quartz 2D) 概述
本篇博客原文地址:http://blog.csdn.net/hello_hwc?viewmode=list 由于自己的项目需要,从网络上下载了许多关于绘制图形的demo,只是用在自己的项目中,很多地方 ...
随机推荐
- [Sdoi2017]数字表格 [莫比乌斯反演]
[Sdoi2017]数字表格 题意:求 \[ \prod_{i=1}^n \prod_{j=1}^m f[(i,j)] \] 考场60分 其实多推一步就推倒了... 因为是乘,我们可以放到幂上 \[ ...
- BZOJ 1492: [NOI2007]货币兑换Cash [CDQ分治 斜率优化DP]
传送门 题意:不想写... 扔链接就跑 好吧我回来了 首先发现每次兑换一定是全部兑换,因为你兑换说明有利可图,是为了后面的某一天两种卷的汇率差别明显而兑换 那么一定拿全利啊,一定比多天的组合好 $f[ ...
- 【视频编解码·学习笔记】6. H.264码流分析工程创建
一.准备工作: 新建一个VS工程SimpleH264Analyzer, 修改工程属性参数-> 输出目录:$(SolutionDir)bin\$(Configuration)\,工作目录:$(So ...
- pandas中的分组技术
目录 1 分组操作 1.1 按照列进行分组 1.2 按照字典进行分组 1.3 根据函数进行分组 1.4 按照list组合 1.5 按照索引级别进行分组 2 分组运算 2.1 agg 2 ...
- python数据分析工具包(3)——matplotlib(一)
前两篇文章简单介绍了科学计算Numpy的一些常用方法,还有一些其他内容,会在后面的实例中学习.下面介绍另一个模块--Matplotlib. Matplotlib是一个Python 2D绘图库,试图让复 ...
- shell实现centos7双网卡修改网卡名eth0,eth1,并设置网络
#!/bin/bash interface1=`ls /sys/class/net|grep en|awk 'NR==1{print}'` interface2=`ls /sys/class/net| ...
- PHP读取大文本文件并处理数据的思路
//处理文件 $file = fopen($filename, "r") or exit("Unable to open file!"); $total_lin ...
- 织梦调用seotitle
如果有seotitle则调用seotitle,没有则调用title {dede:field.array runphp='yes'} if(@me['seotitle']=='') {@me=@me[' ...
- [JSOI2008]最大数maxnumber
[JSOI2008]最大数maxnumber 标签: 线段树 单独队列 题目链接 题解 线段树裸题. 如果一直RE可能是你用的cin/cout. Code #include<cstdio> ...
- php会话(session)实现原理
先考虑如下问题: 禁用了cookie,session能否使用? 如何把session存储数据库/memcached/redis 如何实现一个严格的30分钟过期的会话?. 如何实践web服务器集群的会话 ...