iOS开发-Quartz2D的基本使用(一)

****Quearz2D****是一个二维绘制引擎,同时支持iOS和Mac系统. Quartz 2D能完成绘制图形 : 线条\三角形\矩形\圆\弧等 绘制文字 绘制\生成图片(图像) 读取\生成PDF 截图\裁剪图片片 自定义UI控件.
===为了便于搭建美观的UI界面,iOS提供了UIKit框架,⾥⾯有各种各样的UI控件 利⽤UIKit框架提供的控件,拼拼凑凑,能搭建和现实一些简单、常见的UI界⾯. 但是,有些UI界面极其复杂、⽽且⽐较个性化,⽤普通的UI控件无法实现,这时可以利用Quartz2D技术将控件内部的结构画出来,自定义控件的样子,其实,iOS中⼤部分控件的内容都是通过Quartz2D画出来的,Quartz2D在iOS开发中很重要的⼀个价值是:自定义view(自定义UI控件) .

直线

直线是我们所研究Quartz2D绘制最简单的一种图形,我们怎么实现呢? 上代码

-(void)line1{
    // 1 获取图形上下文(绘图环境,相当于一块画布)
    CGContextRef cxt = UIGraphicsGetCurrentContext();//图形上下文只能获取不能创建
    // 2 描绘路径
    CGMutablePathRef path = CGPathCreateMutable();
    //  起点
    //第一个参数是Path  第二个参数是transform 然后是横纵坐标
    //CGPathMoveToPoint(<#CGMutablePathRef  _Nullable path#>, <#const CGAffineTransform * _Nullable m#>, <#CGFloat x#>, <#CGFloat y#>)
    CGPathMoveToPoint(path, NULL, 50, 50);
    // 终点
    CGPathAddLineToPoint(path, NULL, 200, 200);
    // 3 把路径放到图形上下文
    CGContextAddPath(cxt, path);
    // 4 渲染上下文cxt
    CGContextStrokePath(cxt);
}

我们调用以上方法得到的结果是


屏幕快照 2016-04-11 下午9.30.53.png

但是我们往往不只是在一个画板上画一条直线 有时候我们需要画多条直线 这个时候我们就需要创建多个路径, 我们借助于UIBezierPath,以第一条直线的终点 作为第二条曲线的起点绘制两条直线

-(void)line2{
    //BezierPath(贝瑟尔路径1)
    UIBezierPath *path = [UIBezierPath bezierPath];
    //设置起点
    [path moveToPoint:CGPointMake(50, 50)];
    //设置终点
    [path addLineToPoint:CGPointMake(200, 200)];
    //设置颜色
    [[UIColor redColor] set];
    path.lineWidth = 10;
    //渲染
    [path stroke];
    
    //BezierPath(贝瑟尔路径2)
    UIBezierPath *path1 = [UIBezierPath bezierPath];
    //设置起点
    [path1 moveToPoint:CGPointMake(200, 200)];
    //设置终点
    [path1 addLineToPoint:CGPointMake(200, 300)];
    //设置颜色
    [[UIColor greenColor] set];
    path1.lineWidth = 10;
    //渲染
    [path1 stroke];
}

运行结果如下


多条直线

多条直线的绘制方法类似

曲线

-(void)line3{
    //获取上下文
    CGContextRef cxt = UIGraphicsGetCurrentContext();
    //描述路径(起点)
    CGContextMoveToPoint(cxt, 50, 50);
    // 前一组表示控制点 后一组表示终点
    //CGContextAddQuadCurveToPoint(<#CGContextRef  _Nullable c#>, <#CGFloat cpx#>, <#CGFloat cpy#>, <#CGFloat x#>, <#CGFloat y#>)  
    
    CGContextAddQuadCurveToPoint(cxt, 100, 100, 250, 50);
    // 渲染
    CGContextStrokePath(cxt);
}
曲线

在这里穿插一点: 我们在图形绘制的过程当中 频繁是使用CGContextRef 那么什么是图形上下文?
图形上下文(Graphics Context):是一个CGContextRef类型的数据
图形上下文的作用: (1)保存绘图信息、绘图状态(2)决定绘制的输出目标(绘制到什么地⽅去?)(输出目标可以是PDF⽂文件、Bitmap或者显示器的窗口上)



相同的⼀套绘图序列,指定不同的Graphics Context,就可将相同的图像绘制到不同的目标上 .
****要实现drawRect:⽅法才能绘图到view上, 因为在drawRect:⽅法中才能取得跟view相关联的图形上下文****: 所以我们以上方法的调用都是在drawRect:方法里面
****drawRect:⽅法被调用也是在view第一次显示在屏幕上的时候或者是调用view的setNeedsDisplay或者setNeedsDisplayInRect:时 ****:

接下来我们在自定义的view视图上实现一个画板的效果

#import "DrawView.h"
@interface DrawView ()
{
    //起点和终点
    CGPoint _startPoint;
    CGPoint _endPoint;   
}
//数组保留每一条线
@property(nonatomic,strong)NSMutableArray *pathArr;
@end

@implementation DrawView
-(NSMutableArray *)pathArr{
    if (!_pathArr) {
        _pathArr = [NSMutableArray array];
    }
    return _pathArr;
}

我们实现UIview的touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event和touchesMoved:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event方法

-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
    
    //获取起点
    _startPoint = [[touches anyObject]locationInView:self];
    
    //创建贝瑟尔路径
    UIBezierPath *path = [UIBezierPath bezierPath];
    
    [path moveToPoint:_startPoint];//起点
    
    //添加到数组
    [self.pathArr addObject:path];

}
-(void)touchesMoved:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
    _endPoint = [[touches anyObject]locationInView:self];
    
    //数组中最后一条线
    UIBezierPath *path = [self.pathArr lastObject];
    
    [path addLineToPoint:_endPoint];
    
    //不能直接调用 这个方法
    [self setNeedsDisplay];//setNeedsDisplay会自动调用drawRect方法
}

这个时候我们运行程序 拖动鼠标在view上 可以看到没有任何的反应,因为我们没有实现drawRect:(CGRect)rect;
我们在drawRect:(CGRect)rect方法里面写一下代码

     for (UIBezierPath * path in _pathArr) {
         [[UIColor redColor]set];
         path.lineWidth = 10;
         [path stroke];
     }

效果如下:



我们如果加上橡皮擦, 撤销键等等,就可以实现真正画板功能了,这些我们不在此操作 大家可以按兴趣各自进行.
持续更新中~~~~~~~~~

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,348评论 6 491
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,122评论 2 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,936评论 0 347
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,427评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,467评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,785评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,931评论 3 406
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,696评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,141评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,483评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,625评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,291评论 4 329
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,892评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,741评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,977评论 1 265
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,324评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,492评论 2 348

推荐阅读更多精彩内容