iOS学习——Quartz2D学习之DrawRect
Quartz2D学习之DrawRect
本文以问答形式主要讲述Quartz2D的相关内容,参考内容是网上下载的学习视频资料。
1、什么是Quartz2D?
他是一个二维的绘图引擎,同时支持iOS和Mac系统
2、Quartz2D能完成的工作
画基本线条,绘制文字,图片,截图,自定义UIView.
3、Quartz2D在开发中的价值
当我们的控件样式极其复杂时,可以把控件内部的结构给画出画,就是自定义控件.
4、什么是图形上下文
图形上下文是用来保存用户绘制的内容状态,并决定绘制到哪个地方的.
用户把绘制好的内容先保存到图形上下文,
然后根据选择的图形上下文的不同,绘制的内容显示到地方也不相同,即输出目标也不相同.
5、上下文的类型有哪些?
图形上下文的类型有:
Bitmap Graphics Context(位图上下文)
PDF Graphics Context
Window Graphics Context
Layer Graphics Context(图层上下文,自定义UIView取得上下文就是图层上下文.
UIView之所以能够显示就是因为他内部有一个图层)
Printer Graphics Context
6.如何自定义UIView,步骤是什么?
首先得要有上下文,有了上下文才能决定把绘制的东西显示到哪个地方去.CGContextRef ctx = UIGraphicsGetCurrentContext();
其次就是这个上下文必须得和View相关联.才能将内容绘制到View上面.在DrawRect方法方法里
步骤:
1.要先自定定UIView
2.实现DrawRect方法
3.在DrawRect方法中取得跟View相关联的上下文.
4.绘制路径(描述路径长什么样).
5.把描述好的路径保存到上下文(即:添加路径到上下文)
6.把上下文的内容渲染到View
7、DrawRect方法作用?什么时候调用.
DrawRect作用:专用在这个方法当中绘图的.只有在这个方法当中才能取得跟View相关联的上下文.
DrawRect是系统自己调用的, 它是当View显示的时候自动调用.
8、画线(基本步骤描述)
//1.获取跟View相关联的上下文
CGContextRef ctx = UIGraphicsGetCurrentContext();
//2.绘制路径
UIBezierPath *path = [UIBezierPath bezierPath];
//2.1设置起点
[path moveToPoint:CGPointMake(, )];
//2.2添加一根线到某个点
[path addLineToPoint:CGPointMake(, )];
//3.把路径添加到上下文
CGContextAddPath(ctx,path.CGPath);
//4.把上下文的内容渲染到View上面.
CGContextStrokePath(ctx);
9、 想要再添加一根线怎么办?
第一种方法:重新设置起点,添加一根线到某个点,一个UIBezierPath路径上面可以有多条线.
第二种方法:直接在原来的基础上添加线.把上一条的终点当做下一条线的起点.添加一根线到某个点直接在下面addLineToPoint:
10、怎么样设置线的宽度,颜色,样式?
设置这些样式,我们称为是修改图形上下文的状态.
设置线宽:CGContextSetLineWidth(ctx, 20);
设置线段的连接样式: CGContextSetLineJoin(ctx, kCGLineJoinRound);
添加顶角样式:CGContextSetLineCap(ctx, kCGLineCapRound);
设置线的颜色: [[UIColor redColor] setStroke];
11、如何画曲线?
画曲线方法比较特殊需要一个控制点来决定曲线的弯曲程度.画曲线方法为:
//先设置一个曲线的起点
[path moveToPoint:CGPointMake(, )];
//再添加到个点到曲线的终点.同时还须要一个controlPoint(控件点决定曲线弯曲的方法程序)
[path addQuadCurveToPoint:CGPointMake(, ) controlPoint:CGPointMake(, )];
12、如何画矩形,圆角矩形?
画矩形直接利用UIBezierPath给我们封装好的路径方法bezierPathWithRect:CGRectMake(x, y, width,height)
(x,y)点决定了矩形左上角的点在哪个位置
(width,height)是矩形的宽度高度
圆角矩形的画法多了一个参数,cornerRadius, bezierPathWithRoundedRect: cornerRadius:
cornerRadius它是矩形的圆角半径.
通过圆角矩形可以画一个圆.当矩形是正方形的时候,把圆角半径设为宽度的一半,就是一个圆.
bezierPathWithRoundedRect:CGRectMake(10, 100, 50, 50) cornerRadius:25
13、如果画椭圆,圆?
画椭圆的方法为:bezierPathWithOvalInRect:CGRectMake(x, y, width,height)
前两个参数(x,y)分别代码圆的圆心
后面两个参数(width,height)分别代表圆的宽度,与高度.
宽高都相等时,画的是一个正圆, 不相等时画的是一个椭圆
bezierPathWithOvalInRect:CGRectMake(10, 100, 50, 50)
14、如何利用渲染BezierPath对象的内容?
//设置矩形路径 path
UIBezierPath *path = [UIBezierPath bezierPathWithRect:CGRectMake(, , , )];
//设置边框颜色
[[UIColor greenColor] setStroke];
//设置填充颜色
[[UIColor redColor] setFill];
//设置边框的线宽
path.lineWidth = ;
//画边框
[path stroke];
//填充内部
[path fill];
15、如何画圆弧?
首先要确定圆才能确定圆弧,圆孤它就圆上的一个角度嘛。还是使用UIBezierPath的自带的初始化方法。bezierPathWithArcCenter:(CGPoint) radius:(CGFloat) startAngle:(CGFloat) endAngle:(CGFloat) clockwise:(BOOL)
center:圆心
radius:圆的半径
startAngle:起始角度
endAngle:终点角度
clockwise:Yes顺时针,No逆时针
注意:startAngle角度的位置是从圆的最右侧为0度,即时钟的三点钟方向为起点。
//逆时针画一个半圆
UIBezierPath *path = [UIBezierPath bezierPathWithArcCenter:CGPointMake(, ) radius: startAngle: endAngle:M_PI clockwise:NO];
[path stroke]; //4分之1圆孤
UIBezierPath *path = [UIBezierPath bezierPathWithArcCenter:CGPointMake(, ) radius: startAngle: endAngle:-M_PI_2 clockwise:NO];
[path stroke];
16、如何画扇形
扇形就是在圆弧的基础上进行填充,但是填充需要一个封闭的路径才能填充,所以画扇形的方法为:
1.先画一个圆弧
2.再添加一个一根线到圆心:
3.然后封闭路径:[path closePath],该方法会自动从路径的终点到路径的起点封闭起来,形成一个封闭的路径
4.最后进行填充:[path fill];
//画1/4圆示例
//画圆弧
UIBezierPath *path = [UIBezierPath bezierPathWithArcCenter:CGPointMake(, ) radius: startAngle: endAngle:-M_PI_2 clockwise:NO];
//添加一根线到圆心
[path addLineToPoint:CGPointMake(, )];
//关闭路径,从路径的终点到路径的起点
[path closePath];
//画扇形边框
[path stroke];
//用填充的话,它会默认做一个封闭路径,从路径的终点到起点.
[path fill];
17、如何画饼图
饼图就是多个扇形组成一个圆,所以其画法就是在,依次画每一部分,并设置每一部分的颜色和大小。
- (void)drawRect:(CGRect)rect {
//设置中心为当前视图的中心,饼状图的半径100
CGPoint center = CGPointMake((rect.origin.x + rect.size.width/),
(rect.origin.y + rect.size.height/));
CGFloat radius = ;
//起始初始值为12点钟方向,角度为0,结束值为12点钟方向
CGFloat startA = -M_PI/;
CGFloat angle = ;
CGFloat endA = -M_PI/;
NSArray *datas = @[@,@,@];
//循环画每一部分的扇形
for (NSInteger i = ; i < datas.count; i++) {
startA = endA;
angle = datas[i].floatValue / * M_PI * ;
endA = startA + angle;
//描述路径
UIBezierPath *path = [UIBezierPath bezierPathWithArcCenter:center
radius:radius
startAngle:startA
endAngle:endA
clockwise:YES];
[path addLineToPoint:center];
[path closePath];
//颜色设置 随机生成颜色
[[self randomColor] set];
//填充颜色
[path fill];
}
}
/**
随机颜色:alpha通道它的取值范围是0-255;
OC里面的取值范围只能是0到1,把它 / 255.0就让它到这个范围了,
arc4random_uniform(256)随机产生 0 - 255的数.
颜色通道它的取值范围是0 到 255.
所以说要把0 到 255转换成0 到 1
直接是 0 ~ 255 / 255.0就可以了.
@return
*/
- (UIColor *)randomColor{
CGFloat r = arc4random_uniform()/ 255.0;
CGFloat g = arc4random_uniform()/ 255.0;
CGFloat b = arc4random_uniform()/ 255.0;
return [UIColor colorWithRed:r green:g blue:b alpha:];
}
18、如何进行重绘?
我们绘制扇形、进度条等每当需要改变对应某一部分的值时就需要进行重新绘制,而我们绘制这些信息的内容都是写在 - (void)drawRect:(CGRect)rect方法中,那么我们是否通过直接调用该方法进行重绘呢?答案是否定的。drawRect方法是不能手动调用,因为在drawRect方法中进行绘制图形时需要获取到view的上下文,在前面我们不管是自己获取上下文,还是通过[path stroke]、[path fill]这些方法自动获取上下文,都是需要获取到view的上下文的, 而自己调用的,没有给drawRect方法传递上下文,所以在draw方法中拿不到上下文。系统在调用DrawRect方法时,会自动帮你创建一个跟View相关联的上下文,并且传递给它。
解决办法:想要重绘,调用[self setNeedsDisplay];告诉系统重新绘制View,系统就会自动帮你调用drawRect方法,系统在调用drawRect方法,它会帮你创建上下文
iOS学习——Quartz2D学习之DrawRect的更多相关文章
- iOS学习——Quartz2D学习之UIKit绘制
iOS学习——Quartz2D学习之UIKit绘制 1.总述 在IOS中绘图技术主要包括:UIKit.Quartz 2D.Core Animation和OpenGL ES.其中Core Animati ...
- iOS开发如何学习前端(2)
iOS开发如何学习前端(2) 上一篇成果如下. 实现的效果如下. 实现了一个横放的<ul>,也既iOS中的UITableView. 实现了当鼠标移动到列表中的某一个<li>,也 ...
- iOS开发如何学习前端(1)
iOS开发如何学习前端(1) 我为何学前端?因为无聊. 概念 前端大概三大块. HTML CSS JavaScript 基本上每个概念在iOS中都有对应的.HTML请想象成只能拉Autolayout或 ...
- 移动开发iOS&Android对比学习--异步处理
在移动开发里很多时候需要用到异步处理.Android的主线程如果等待超过一定时间的时候直接出现ANR(对不熟悉Android的朋友这里需要解释一下什么叫ANR.ANR就是Application Not ...
- 关于iOS开发的学习
关于iOS开发的学习,打个比方就像把汽车分解: 最底层的原料有塑料,钢铁 再用这些底层的东西造出来发动机,座椅 最后再加上写螺丝,胶水等,把汽车就拼起来了 iOS基本都是英文的资料, ...
- IT人的自我导向型学习:学习的4个层次
谈起软件开发一定会想到用什么技术.采用什么框架,然而在盛行的敏捷之下,人的问题逐渐凸显出来.不少企业请人来培训敏捷开发技术,却发现并不能真正运用起来,其中一个主要原因就是大家还没有很好的学习能力.没有 ...
- IT人的自我导向型学习:学习的3个维度
看到大家对我的文章赞了不少,看来大家还比较喜欢看.园子里的一些朋友和我说:”终于又看到你要在园子里发原创文章了.几年前就受益匪浅,经过几年的成长分享来的东西肯定也是精品.“ 感谢大家对我的信任,如果你 ...
- Deep Learning(深度学习)学习笔记整理系列之(五)
Deep Learning(深度学习)学习笔记整理系列 zouxy09@qq.com http://blog.csdn.net/zouxy09 作者:Zouxy version 1.0 2013-04 ...
- Deep Learning(深度学习)学习笔记整理系列之(八)
Deep Learning(深度学习)学习笔记整理系列 zouxy09@qq.com http://blog.csdn.net/zouxy09 作者:Zouxy version 1.0 2013-04 ...
随机推荐
- php框架rbac功能分析
四大php框架rbac功能分析对比
- 《ServerSuperIO Designer IDE使用教程》-4.增加台达PLC驱动及使用教程,从0到1的改变。发布:v4.2.3版本
v4.2.3 更新内容:1.优化数据存储部分,提高效率.2.修复数据库服务停止造成程序异常退出的现象.3.修复本机没有串口造成无法增加设备驱动的情况.4.增加编辑设备和监测点配置信息功能.5.增加台达 ...
- 《ServerSuperIO Designer IDE使用教程》-2.与硬件网关数据交互,并进行数据级联转发,直到云端。发布:v4.2.1版本
v4.2.1 更新内容:1.重新定义数据转发文本协议,使网关与ServerSuperIO以及之间能够相关交互数据.2.扩展ServerSuperIO动态数据类的方法,更灵活.3.修复Designer增 ...
- 设置和取消git代理
# 设置socket5代理 git config --global http.proxy 'socks5://127.0.0.1:1087' git config --global https.pro ...
- Vue-Router动态路由匹配
//重点在于路由出口 <p> <!-- 使用 router-link 组件来导航. --> <!-- 通过传入 `to` 属性指定链接. --> <!-- & ...
- Vue.js的安装及简单使用
一.Vue简介 二.Vue.js的安装 2.1.npm安装 2.1.1.node.js介绍及安装 简介: 简单的说 Node.js 就是运行在服务端的 JavaScript. Node.js 是一个基 ...
- css3_transition: 体验好的过渡效果。附 好看的按钮
利用css的transition属性详解,上图就是利用transition效果做的一个按钮. transition属性://举例子:transition:all 1s ease;transition: ...
- Gedit —— 推荐于NOI系列考试(NOIlinux)的轻量编程环境
由于Vim,Emacs上手艰难,Guide又特别难用,Anjuta还闪退 故推荐一款轻量化的编程环境:Gedit(文本编辑器) 配置方法: 1:在桌面上新建main.cpp,打开方式选择使用gedit ...
- iOS 开发中单元格cell高度自适应
高度自适应分下面两种情况 1.用代码自定义的cell 用代码自定义的cell,cell高度自定义需要我们手动的去计算每个cell的字符串高度.然后返回对应的高度即可. 2.用XIB 或者 StoreB ...
- React(八)样式及CSS模块化
(1)内联样式 注:样式要采用驼峰命令发,如果非要使用原生css样式写法,需加引号 缺点:一些动画,伪类不能使用 class App extends Component { constructor(p ...