Quartz 2D 涂鸦

这一节,我将介绍使用Quartz 2D实现的一个实例 -- 涂鸦。在介绍直接,先介绍一下贝塞尔曲线的基本概念。

Bezier Path 基础

UIBezierPath对象是CGPathRef数据类型的封装。path如果是基于矢量形状的,都用直线和曲线段去创建。我们使用直线段去创建矩形和多边形,使用曲线段去创建弧(arc),圆或者其他复杂的曲线形状。每一段都包括一个或者多个点,绘图命令定义如何去诠释这些点。每一个直线段或者曲线段的结束的地方是下一个的开始的地方。每一个连接的直线或者曲线段的集合成为subpath。一个UIBezierPath对象定义一个完整的路径包括一个或者多个subpaths。

创建和使用一个path对象的过程是分开的。创建path是第一步,包含一下步骤:

(1)创建一个Bezier path对象。

(2)使用方法moveToPoint:去设置初始线段的起点。

(3)添加line或者curve去定义一个或者多个subpaths。

(4)改变UIBezierPath对象跟绘图相关的属性。

例如,我们可以设置stroked path的属性lineWidth和lineJoinStyle。也可以设置filled path的属性usesEvenOddFillRule。

我这里绘制的涂鸦效果,就是使用的UIBezierPath。效果图如下(字写的有点难看,莫怪~~~):

需求说明:

本demo支持,曲线随意画。

1. 通过点击“红绿蓝”,可以拾取自己想要的绘制颜色。

2. 通过拖拽UISlider,可以改变曲线的粗细。

3. 支持撤销、清屏、保存到相册的功能。

设计分析:

1. 每一条曲线,都有线宽,颜色,及路径信息,所以我们可以定义一个模型,用于存储这些信息。

2. 涂鸦效果是由很多条曲线构成的,所以我们可以定义一个可变数组,用于存放上面的很多模型数据。

3. 在执行撤销,清屏操作的时候,我们只需要对数组进行删除最后一条记录或者清空操作,然后调用[self  setNeedsDisplay] 方法,实时绘制。

大致代码:

自定义的模型 DrawModel.h:

@interface DrawModel : NSObject
@property (nonatomic, assign) CGFloat lineNewWidth;
@property (nonatomic, strong) UIColor *lineNewColor;
@property (nonatomic, strong) UIBezierPath *path;
@end

绘制界面的头文件 DrawView.h:

@interface DrawView : UIView

@property (nonatomic, assign) CGFloat lineNewWidth;
@property (nonatomic, strong) UIColor *lineNewColor;

- (void)back;
- (void)clear;

@end

可变数组的定义及懒加载

@property (nonatomic,strong) NSMutableArray *infos;

- (NSMutableArray *)infos {
    if (!_infos) {
        _infos = [NSMutableArray array];
    }
    return _infos;
}

点击颜色按钮和滑动UISlider应该改变对应的值

- (void)setLineNewWidth:(CGFloat)lineNewWidth {
    _lineNewWidth = lineNewWidth;
}

- (void)setLineNewColor:(UIColor *)lineColor {
    if (lineColor == nil) {
        _lineNewColor = [UIColor blackColor];
    } else {
        _lineNewColor = lineColor;
    }
}

撤销及清屏操作

- (void)back {
    [self.infos removeLastObject];
    [self setNeedsDisplay];
}

- (void)clear {
    [self.infos removeAllObjects];
    [self setNeedsDisplay];
}

保存到相册大致代码

UIImage *newImage = [UIImage imageWithView:self.paintView];
UIImageWriteToSavedPhotosAlbum(newImage, self, @selector(image:didFinishSavingWithError:contextInfo:), nil);

贝塞尔曲线保存路径及模型创建代码如下

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{

    UITouch *touch = [touches anyObject];
    CGPoint startPoint = [touch locationInView:touch.view];

    UIBezierPath *path = [UIBezierPath bezierPath];

    [path moveToPoint:startPoint];

    DrawModel *model = [[DrawModel alloc] init];
    model.lineNewWidth = self.lineNewWidth == 0 ? 1: self.lineNewWidth;
    model.lineNewColor = self.lineNewColor;
    model.path = path;

    [self.infos addObject:model];

    [self setNeedsDisplay];

}

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {

    UITouch *touch = [touches anyObject];
    CGPoint movePoint = [touch locationInView:touch.view];

    DrawModel *model = [self.infos lastObject];
    UIBezierPath *path = model.path;
    [path addLineToPoint:movePoint];

    [self setNeedsDisplay];
}

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
    [self touchesMoved:touches withEvent:event];
}

对代码进行大致说明:

1.每次手指按下时,会触发touchesBegan方法,每次创建一个UIBezierPath路径及创建数据模型DrawModel,并且将模型数据放到数组infos中。

2.手指拖动的时候,会触发touchesMoved方法,立刻从数组infos中取出拖拽前创建的UIBezierPath,并且将绘制所有的点的集合保存在贝塞尔曲线中。

3.手指抬起的时候,会触发touchesEnded方法,理论上只有一个点,但也应该完成最终的绘制,由于他所做得工作和touchesMoved一致,所以直接调用touchesMoved方法即可。

关键绘制代码如下:

- (void)drawRect:(CGRect)rect {

    for (DrawModel *model in self.infos) {
        UIBezierPath *path = model.path;
        path.lineWidth = model.lineNewWidth;
        path.lineCapStyle = kCGLineCapRound;
        path.lineJoinStyle = kCGLineJoinRound;
        [model.lineNewColor set];
        [path stroke];
    }
}

每次调用[self  setNeedsDisplay] 方法就会触发drawRect方法。在这个方法中,我们只需要遍历infos数组,获取到每个模型数据信息,然后设置绘制相关信息就可以了。

时间: 2024-08-28 05:33:39

Quartz 2D 涂鸦的相关文章

1.0 Quartz 2D简介

Quartz2D须知: (1)Quartz 2D是苹果官方的二维绘图引擎,同时支持iOS和Mac OS X系统(跨平台,纯 C 语言的) (2)Quartz2D的API是纯C语言的 (3)Quartz2D的API来自于Core Graphics框架         (4)数据类型和函数基本都以CG作为前缀 CGContextRef —— 图形上下文(相当于一个草稿纸) CGPathRef  ——— 图形路径 CGContextStrokePath(cox);   ——— 渲染 Quartz2D 

Quartz 2D 屏幕解锁

上一节中,我讲解了利用Quartz 2D完成的涂鸦功能,其实主要是利用了贝塞尔曲线来完成的.可以发现,涂鸦效果中,绘制出来的,一般都是曲线效果.这一节,我讲解利用贝塞尔曲线画直线的案例:屏幕解锁.先看看最终效果图. 这个demo就是仿真"支付宝屏幕解锁"的效果. 1. 分析UI, 有三张图片:一张大的背景图片:手指没有滑到区域的按钮,灰白色的圈圈:手指滑到区域的按钮,高亮显示的按钮.注:按钮与按钮之间的连线,是通过代码实现的,因为有各种各样的线,图片实现不现实. 2. 代码实现分析:

Quartz 2D 的一些使用

Quartz 2D是一个绘图框架,最近看了一下它的官方文档以及提供的的demo.看着这些资料自己做了一些小结. 1.线段的绘制 (绘制一条线段) //获取图像上下文 CGContextRef context = UIGraphicsGetCurrentContext(); //设置线条颜色 CGContextSetRGBStrokeColor(context, .5, .5, .5, 1); //设置线条宽度 CGContextSetLineWidth(context, 1); //设置起点 C

Quartz 2D编程指南(7) - 阴影(Shadows)

阴影是绘制在一个图形对象下的且有一定偏移的图片,它用于模拟光源照射到图形对象上所形成的阴影效果,如果7-1所示.文本也可以有阴影.阴影可以让一幅图像看上去是立体的或者是浮动的. 阴影有三个属性: 1.x偏移值,用于指定阴影相对于图片在水平方向上的偏移值. 2.y偏移值,用于指定阴影相对于图片在竖直方向上的偏移值. 3.模糊(blur)值,用于指定图像是有一个硬边(hard edge,如图7-2左边图片所示),还是一个漫射边(diffuse edge,如图7-1右边图片所示) 本章将描述阴影是如何

Quartz 2D Programming Guide

Quartz 2D Programming  Guide 官方文档: Quartz 2D Programming Guide 译文: Quartz 2D编程指南(1) - 概览 Quartz 2D编程指南(2) - 图形上下文(Graphics Contexts) Quartz 2D编程指南(3) - 路径(Paths)[上] Quartz 2D编程指南(3) - 路径(Paths)[下] Quartz 2D编程指南(4) - 颜色和颜色空间 Quartz 2D编程指南(5) - 变换 Quar

iOS开发——图形编程OC篇&(六)Quartz 2D高级使用(二)

Quartz 2D高级使用 一.绘图路径 A.简单说明 在画线的时候,方法的内部默认创建一个path.它把路径都放到了path里面去. 1.创建路径  cgmutablepathref 调用该方法相当于创建了一个路径,这个路径用来保存绘图信息. 2.把绘图信息添加到路径里边. 以前的方法是点的位置添加到ctx(图形上下文信息)中,ctx 默认会在内部创建一个path用来保存绘图信息. 在图形上下文中有一块存储空间专门用来存储绘图信息,其实这块空间就是CGMutablePathRef. 3.把路径

iOS开发——图形编程OC篇&(三)Quartz 2D绘图

绘图 一.简单说明 图形上下文(Graphics Context):是一个CGContextRef类型的数据 图形上下文的作用:保存绘图信息.绘图状态 决定绘制的输出目标(绘制到什么地方去?)(输出目标可以是PDF文件.Bitmap或者显示器的窗口上) 相同的一套绘图序列,指定不同的Graphics Context,就可将相同的图像绘制到不同的目标上. Quartz2D提供了以下几种类型的Graphics Context: Bitmap Graphics Context PDF Graphics

iOS开发——图形编程OC篇&(一)Quartz 2D介绍

Quartz 2D介绍 一.什么是Quartz2D Quartz 2D是?个二维绘图引擎,同时支持iOS和Mac系统 Quartz 2D能完成的工作: 绘制图形 : 线条\三角形\矩形\圆\弧等 绘制文字 绘制\生成图片(图像) 读取\生成PDF 截图\裁剪图片 自定义UI控件 二.Quartz2D在iOS开发中的价值 为了便于搭建美观的UI界面,iOS提供了UIKit框架,??有各种各样的UI控件 UILabel:显?文字 UIImageView:显示图片 UIButton:同时显示图片和?字

Quartz 2D简介

1.Quartz 2D是一种二维绘图库,它与iphone OS紧密结合在一起,能协同所有相关框架进行工作,包括Core Animation.OpenGL ES和UIKit. 2.Quartz的绘图功能取决与3个核心概念:上下文.路径和状态. ①上下文(context):用户描述将图形写入哪里,该过程由CGContextRef定义.通常,可以写入UIView或位图中. ②路径:路径是那些经常在Quartz中绘制的内容.起初,他们是线段和弧的集合,随后通过描边或填充的方式绘制到屏幕中. ③状态:状态