整理一下CoreGraphic和Quartz2D的知识(二)
利用Quartz2D绘图的基本步骤
#pragma mark 绘制一条直线 - (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包含了好几次
,通过指定模式可以将这一块空出来,下面是集中模式及其解释
4. 填充模式
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上
#pragma mark 绘制图像 - (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上
#pragma mark 绘制文本 - (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]; }
上面的 NSFontAttributeName等可以实现文字样式的多样化,这些是在iOS6中定义的,但是在iOS7随着苹果设计的扁平化和简洁化才开始得以大量使用
不光可以设定文字的颜色和大小,还金额一设置下划线等属性