整理一下CoreGraphic和Quartz2D的知识(二)

2017-01-03  本文已影响0人  大爷你的伞

原文传送门

利用Quartz2D绘图的基本步骤

  1. 获取与视图相关联的上下文对象
    –UIGraphicsGetCurrentContext
  2. 创建及设置路径 (path)
    –2.1 创建路径
    –2.2 设置路径起点
    –2.3 增加路径内容……
  3. 将路径添加到上下文
  4. 设置上下文属性
    –边线颜色、填充颜色、线宽、线段连接样式、线段首尾样式、虚线样式…
  5. 绘制路径
  6. 释放路径
    什么是路径?
    •路径定义了一条或者或多条形状或子路径
    •子路径可以包含一条或者多条直线或曲线
    •子路径也可以是一些简单的形状,例如线、圆形、矩形或者星型等
    •子路径还可以包含复杂的形状,例如地图轮廓或者涂鸦等
    •路径可以是开放的,也可以是封闭的;对于封闭路径可以空心的也可以是实心的
    下面写一些代码来看看效果~,注意下面写的函数需要在UIView类及其子类的drawRect:方法中调用,原因见上一篇
#pragmamark 绘制一条直线
- (void)drawLine{
    //1. 获取当前图形上下文,就是要绘制到屏幕 
   CGContextRef context =UIGraphicsGetCurrentContext();
   //2. 设置路径CGMutablePathRef path =CGPathCreateMutable();
   //1) 移动到某一个点CGPathMoveToPoint(path, NULL,100,100);
   //2) 增加一条直线CGPathAddLineToPoint(path, NULL,200,200);
   //3. 将路径添加到上下文CGContextAddPath(context, path);
   //4. 设置上下文
   //1) 设置线条颜色CGContextSetRGBStrokeColor(context,1.0,0.0,0.0,1.0);
   //5. 将上下文中的路径绘制出来CGContextDrawPath(context, kCGPathStroke);
   //6. 释放路径CGPathRelease(path);
}

其实为了方便程序员进行开发,也可以直接使用上下文内置的路径进行绘图而不是用上下文+路径的方法

//1. 获取上下文CGContextRef context =UIGraphicsGetCurrentContext();
//2. 设置上下文中的路径CGContextMoveToPoint(context,100,100);
CGContextAddLineToPoint(context,200,200);
CGContextAddLineToPoint(context,100,200);//CGContextAddLineToPoint(context, 100, 100);
//关闭路径
CGContextClosePath(context);
// 设置边线颜色
[[UIColor redColor] setStroke];
// 设置填充颜色
[[UIColor blueColor] setFill];
// 同时设置边线和填充颜色
[[UIColor greenColor] set];
// 4. 绘制上下文
CGContextDrawPath(context, kCGPathFillStroke);

上面代码中,如果注释的那句打开而CGContextClosePath(context)被注释掉的话,绘画出一个三角形
如果按照上面的代码来,也绘画出一个三角形---{CGContextClosePath(context)的功能是将该上下文目前画出的路径封闭起来}
因为核心图形使用非常频繁,因此UIKit对于常用的绘图做了一定的封装
CGContextDrawPath(context, kCGPathFillStroke);这句语句的第二个参数是指定绘图的模式,可以绘制异或的图像等等.例如如果有一块被path包含了好几次,通过指定模式可以将这一块空出来,下面是集中模式及其解释

填充模式
kCGPathFill 填充绘制,针对关闭的路径使用
kCGPathStroke 绘制线条,无所谓路径是否关闭
kCGPathFillStroke 填充并绘制线条
kCGPathEOFill 异或填充,针对关闭路径使用
kCGPathEOFillStroke 异或填充并画线
下面的代码是画一个矩形

CGRect rect = CGRectMake(100,100,200,200);
[[UIColor redColor]set];
//绘制实心矩形
UIRectFill(rect);
CGRect rect1= CGRectMake(150,150,50,50);
[[UIColor blueColor]set];
//绘制空心举行
UIRectFrame(rect1);

下面的代码是画一个圆形

CGContextRef context =UIGraphicsGetCurrentContext();
//在iOS中,如果要绘制圆形,需要先指定一个矩形//绘制出来的圆形,是内切于该矩形的
//1. 指定绘制圆形外切的矩形
CGRect rect = CGRectMake(100,100,150,150);
//2. 添加圆形到上下文路径
CGContextAddEllipseInRect(context, rect);
//3. 绘制圆形

CGContextDrawPath(context, kCGPathFill);

下面的代码是画质一条弧线

- (void)drawArc
{
CGContextRef context=UIGraphicsGetCurrentContext();
/**
弧线参数:
1)上下文
2) x, y 弧线所在圆上的圆心
3)半径
4) 开始角度、结束角度,0度是圆形最右侧的点
5) 顺时针:0 逆时针:1
*/
CGContextAddArc(context,160,240,100,0, -M_PI_2,0);
//3. 绘制圆形
CGContextDrawPath(context, kCGPathFill);
}

下面的代码是将一张图片以绘制的方式展现在View上

#pragmamark 绘制图像
- (void)drawImage
{
  //提示:绘制的图像,只能看不能交互,相对而言,性能比UIImageView要高
  UIImage *image = [UIImage imageNamed:@"头像1"];
  //1. 在指定坐标绘制//[image drawAtPoint:CGPointMake(80, 80)];
  //2. 在指定区域内拉伸绘制
  //[image drawInRect:CGRectMake(100, 100, 150, 250)];
  //3. 平铺绘制
  [image drawAsPatternInRect:self.bounds];
}

下面的代码是绘制文字,NSString可以直接调用方法,将文字绘制在view上

#pragmamark 绘制文本- (void)drawText
{
NSString*text =@"床前明月光,疑是地上霜!";
UIFont*font = [UIFont systemFontOfSize:17];
NSDictionary*dict =@{NSFontAttributeName: font, NSForegroundColorAttributeName: [UIColor redColor]};
//以下方法在iOS7被废弃
//[text sizeWithFont:font constrainedToSize:CGSizeMake(100, 10000) lineBreakMode:NSLineBreakByCharWrapping];
CGRect rect = [text boundingRectWithSize:CGSizeMake(20,10000) options:NSStringDrawingUsesLineFragmentOrigin attributes:dict context:nil];
rect.origin= CGPointMake(100,20);
//给文本加一个背景颜色
[[UIColor lightGrayColor]set];
UIRectFill(rect);
//在iOS7中,所有文本绘制属性,均需要使用属性字典进行设置!
//[[UIColor redColor] set];
[text drawInRect:rect withAttributes:dict];
上一篇 下一篇

猜你喜欢

热点阅读