Quartz 2D绘图

(1) 绘图Context是一个绘图的目标对象,定义了绘图的基本属性,如颜色、绘图范围、线宽及样式等。

(2)通过UIView会创建Context,可以用类似如下的语句来得到当前的Context.

CGContextRef currentContext = UIGraphicsGetCurrentContext();

(3)如果在对其进行修改前想要保存当前状态,可以使用UIGraphicsPushContext;

要恢复保存过的Context,则可用UIGraphicsPopContext。

(4)path,路径其实就是用一系列坐标点标识出来的一条曲线或折线,创建好之后就可以沿其画线,或者对封闭的空间进行填充。

//重写初始化方法,在视图初始化的时候创建并设置自定义的Context
-(instancetype)initWithFrame:(CGRect)frame {
    if (self = [super initWithFrame:frame]) {
        self.backgroundColor = [UIColor whiteColor];
        CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();//指定色彩空间为RGB

whiteBoardContext = CGBitmapContextCreate(NULL, self.frame.size.width, self.frame.size.height, 8, 4 * self.frame.size.width, colorSpace, kCGImageAlphaPremultipliedFirst);

}

return self;

}

出现这个警告得处理方法:http://blog.csdn.net/thanklife/article/details/25790433

//
//  WhiteBoardView.m
//  draw2
//
//  Created by K-Net on 15-5-7.
//  Copyright (c) 2015年 K-Net. All rights reserved.
//

#import "WhiteBoardView.h"
//#if __IPHONE_OS_VERSION_MAX_ALLOWED > __IPHONE_6_1
//#define kCGImageAlphaPremultipliedLast (kCGBitmapByteOrderDefault | kCGImageAlphaPremultipliedLast)
//#else
//#define kCGImageAlphaPremultipliedLast  kCGImageAlphaPremultipliedLast
//#endif

@implementation WhiteBoardView
//重写初始化方法,在视图初始化的时候创建并设置自定义的Context
-(instancetype)initWithFrame:(CGRect)frame {
    if (self = [super initWithFrame:frame]) {
        self.backgroundColor = [UIColor whiteColor];
        CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();//指定色彩空间为RGB
        whiteBoardContext = CGBitmapContextCreate(NULL, self.frame.size.width, self.frame.size.height, 8, 4 * self.frame.size.width, colorSpace, (CGBitmapInfo)kCGImageAlphaPremultipliedFirst);
//        kCGBitmapAlphaInfoMask = 0x1F,
//        kCGBitmapFloatComponents = (1 << 8),
//        (CGBitmapInfo)kCGImageAlphaPremultipliedFirst
//        kCGBitmapByteOrderMask = 0x7000,
//        kCGBitmapByteOrderDefault = (0 << 12),
//        kCGBitmapByteOrder16Little = (1 << 12),
//        kCGBitmapByteOrder32Little = (2 << 12),
//        kCGBitmapByteOrder16Big = (3 << 12),
//        kCGBitmapByteOrder32Big = (4 << 12)
       
        CGColorSpaceRelease(colorSpace);
        //创建新的CGLayer,用于画图
        whiteBoardLayer =CGLayerCreateWithContext(whiteBoardContext, self.frame.size, NULL);
        //获得新建层的context
        CGContextRef layerContext = CGLayerGetContext(whiteBoardLayer);
        //指定新建层Context的线宽
        CGContextSetLineWidth(layerContext, 1.5);
        //指定线头形状为圆形
//        enum CGLineCap {
//            kCGLineCapButt,
//            kCGLineCapRound,
//            kCGLineCapSquare
//        };
        CGContextSetLineCap(layerContext, kCGLineCapRound);
        //指定线的颜色,黑色
        CGContextSetRGBStrokeColor(layerContext, 0.0, 0.7, 0.0, 1);
    }
    return self;
}
//重写drawRect方法
-(void)drawRect:(CGRect)rect {
    //先得到当前的Context
    CGContextRef currentContext = UIGraphicsGetCurrentContext();
    //根据Context的内容生成Bitmap
    CGImageRef image = CGBitmapContextCreateImage(currentContext);
    //把bitmap绘制到Context上
    CGContextDrawImage(currentContext, [self bounds], image);
    //把whiteBoardLayer也绘到当前Context上
    CGContextDrawLayerInRect(currentContext, [self bounds], whiteBoardLayer);
}

//屏幕触摸事件  触摸开始

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    //得到touch对象
    UITouch *theTouch = [touches anyObject];
    if ([theTouch tapCount] == 2) {//如果是双击,就清空图像
        //CGContextClearRect清楚指定矩形区域上绘制的图形
        CGContextClearRect(whiteBoardContext, [self bounds]);//清空
        [self setNeedsDisplay];//刷新屏幕显示
    } else {
        [self touchesMoved:touches withEvent:event];
    }
}
//手指移动触发事件
-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
    UITouch *theTouch = [touches anyObject];//获取任意手指触摸
    //获取当前的位置
    CGPoint currentTouchLocation = [theTouch locationInView:self];
    //得到上次的位置
    CGPoint lastTouchLocation = [theTouch previousLocationInView:self];
    //取得Context
    CGContextRef layerContext = CGLayerGetContext(whiteBoardLayer);
    //开始定义path
    CGContextBeginPath(layerContext);
    //把path的起点移动到上次位置
    CGContextMoveToPoint(layerContext, lastTouchLocation.x, lastTouchLocation.y);
    //在上次位置和当前位置之间连线,并计入path
    CGContextAddLineToPoint(layerContext, currentTouchLocation.x, currentTouchLocation.y);
    //沿path画线
    CGContextStrokePath(layerContext);
    [self setNeedsDisplay];//刷新屏幕显示
    NSLog(@"-================");
}
@end

时间: 2024-10-10 16:09:28

Quartz 2D绘图的相关文章

Quartz 2D 绘图,图像变换

IOS的quartz 2d 绘图,绘图有时候需要进行图形变换. 切记:Quartz 2D的变换都是以CG 开头的,不要和Core Animation的搞混了,Core animatin的是CA开头的. IOS提供了一组可以进行图像变换的API接口,一般的图像变换分为,平移.缩放.旋转. 平移 void CGContextTranslateCTM(CGContextRef c, CGFloat tx, CGFloat ty); 缩放 void CGContextScaleCTM(CGContext

ios (Quartz 2D绘图)各种绘图方式及相机的使用

一: 具体使用的细节,本人也是参考http://blog.163.com/wkyuyang_001/blog/static/10802122820133190545227/ 下面介绍具体使用Quartz 2D绘图实现画图板功能 .m文件中,dog的实现如连接中所示一样的 <pre name="code" class="objc">#import "drawTestView.h" #import "Dog.h" @i

1 、Quartz 2D绘图基础

Quartz 2D绘图 Quartz 2D绘图的核心API是CGContextRef,该API专门用于绘制各种图形. 关注微信公众号:ioscoding ,分享优质iOS编程技术.by:shuju 1.1  Quartz 2D绘图基础:CGContextRef 使用Quartz 2D绘图的关键步骤有两步:获取CGContextRef:调用CGContextRef的方法进行绘图. 不同场景下获取CGContextRef的方式各不相同,下面介绍iOS开发中最常见的场景下如何获取CGContextRe

Core Graphics框架 利用Quartz 2D绘图

首先,什么是Core Graphics和Quartz 2D? Core Graphics:是基于Quartz 2D绘图引擎的一个C语言的API绘图框架.它也是iOS开发中最基本的框架(Framework)之一.两点原因,第一是该框架是每一个iOS应用最初被建立时,就被系统默认添加的三个框架(Foundation.UIKit.Core Graphics)之一:另一点是,我们平时常见的各种UIKit框架提供的UI控件,实际上都是由Core Graphics进行绘制的. Quartz 2D:是一个绘图

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

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

绘图与滤镜全面解析--Quartz 2D 、Core Image

绘图与滤镜全面解析 概述 在iOS中可以很容易的开发出绚丽的界面效果,一方面得益于成功系统的设计,另一方面得益于它强大的开发框架.今天我们将围绕iOS中两大图形.图像绘图框架进行介绍:Quartz 2D绘制2D图形和Core Image中强大的滤镜功能. Quartz 2D 基本图形绘制 视图刷新 其他图形上下文 Core Image Quartz 2D 在iOS中常用的绘图框架就是Quartz 2D,Quartz 2D是Core Graphics框架的一部分,是一个强大的二维图像绘制引擎.Qu

Quartz 2D基本绘图

上一节中,我引用别人的文章,详细的讲解了Quartz 2D的基本概念.想了解的,请点击这里.这一节用几个小Demo,来说明Quartz 2D的绘图功能. 1. 我们先定义一个用来绘图的View(DrawView,它继承自UIView),并准备在下面的方法中实现绘图工作. - (void)drawRect:(CGRect)rect; 2. 在主界面上面拖拽一个View,并且将其Class设置为DrawView. 首先,我们来绘制线段,三角形和矩形. 1. 线段:在drawRect:方法中,写入以下

iOS 开发 Quartz 2D+ UIBezierPath绘图大全详解

Quartz 2D 使用大全结构图 UIKIt UIBezierPath Core Graphics OpenGL ES Quartz2D的区别和联系 UIKIt:UIKit中的控件都是基于Core Graphics实现的 UIBezierPath:UIBezierPath属于UIKit,它是苹果对复杂的Core Graphics进行的封装,方便我们用OC语言进行简单的绘图 Core Graphics:是一套基于C语言的API,支持向量图形,线.形状.图案.路径.剃度.位图图像和pdf 内容的绘

Quartz-2D绘图之概览

最近公司新项目需求要把数据图形化,趁着这个机会,重温了下Quarts-2D这个强大的跨平台2D绘图引擎. 一.Quartz概述 1.Quartz 2D是一个二维的绘图引擎,支持iOS和Mac OS平台. 2.功能:可以用来进行基本路径的绘制.透明度.描影.绘制阴影.透明层.颜色管理.反锯齿.PDF文档生成和PDF元数据访问等 二.Quartz操作 1.绘图顺序:Quartz既然是一个绘图引擎,那么画画的先后顺序是非常重要的,下图便展示了它的操作顺序,相信大家都很熟悉这幅图 2.绘制目标:Grap