iOS 可以用的画笔:
本文参考:
http://www.360doc.com/content/15/0929/15/11764545_502227892.shtml
相关库
1, CGPath
CoreGraphics--CGPath.h
2, CGContext
CoreGraphics--CGContext.h
3,UIBezierPath
UIKit---UIBezierPath
流程总结
1、画布-》
2、
构建路径:开始、构建、闭合-》
或者直接在画布上构建路径
3、设置描边颜色、填充颜色、线条连接样式、收尾两端样式-》
4、给画布增加路径-》
5、绘制: 描边 或是 填充
代码实践
#import "MyDrawView.h"
#define rad(x) ((x)*M_PI/ 180.0)
@implementation MyDrawView
-(void)drawRect:(CGRect)rect {
// 在画布上直接操作路径。
[self line];
// [self arc];
// 先操作路径, 然后添加到画布上。当画布绘制后,路径就没有了。 所以才有了保存路径的
// [self pathLine];
}
-(void)pathLine{
// 1、画布
CGContextRef context = UIGraphicsGetCurrentContext();
// 2、路径
CGMutablePathRef path= CGPathCreateMutable();
CGPathAddArc(path, NULL, CGRectGetMidX(self.frame), 300, 200, 0, 2*M_PI, 1);
CGPathCloseSubpath(path);
// 添加一个路径到画布
[self track:context];
CGContextAddPath(context, path);// 画布上有路径了
[self track:context];
// 3、设置 颜色、线的样式
CGContextSetStrokeColorWithColor(context, [UIColor redColor].CGColor);
CGContextSetFillColorWithColor(context, [UIColor blueColor].CGColor);
// 两条线连接处的样式
CGContextSetLineJoin(context, kCGLineJoinRound);
// 线的收尾两端的样式
CGContextSetLineCap(context, kCGLineCapButt);
// 线的宽度
CGContextSetLineWidth(context, 30);
// 4、绘制
[self track:context];
CGContextDrawPath(context, kCGPathFillStroke);
// 画布清空了
[self track:context];
}
-(void)line{
CGFloat top=50;
CGFloat left=30;
CGFloat w=200;
CGFloat h=60;
// 1、画布
CGContextRef context= UIGraphicsGetCurrentContext();
// 2、路径
// 构建路径之前,先标记
CGContextBeginPath(context);
//CGContextMoveToPoint(context, 100, 100);
CGPoint p[6] = {
{left+w, top},
{left, top},
{left, top+h},
{left+w, top+h},
{left+w, top+2.0*h},
{left, top+2.0*h}
};
[self track:context];
CGContextAddLines(context, p, 6);// 画布上有路径了
[self track:context];
// 闭合当前路径, 随后为一个新路径, 新路径起点为当前点
CGContextClosePath(context);
[self track:context];
// 测一下新的子路径
top = top+3.0*h;
CGPoint p2[6] = {
{left+w, top},
{left, top},
{left, top+h},
{left+w, top+h},
{left+w, top+2.0*h},
{left, top+2.0*h}
};
CGContextAddLines(context, p2, 6);// 画布上有路径了
// 3、设置 颜色、线的样式
CGContextSetStrokeColorWithColor(context, [UIColor redColor].CGColor);
CGContextSetFillColorWithColor(context, [UIColor blueColor].CGColor);
// 两条线连接处的样式
// kCGLineJoinMiter, 斜切连接
// kCGLineJoinRound, 圆角连接
// kCGLineJoinBevel, 斜角连接
CGContextSetLineJoin(context, kCGLineJoinRound);
// 线的收尾两端的样式
CGContextSetLineCap(context, kCGLineCapButt);
// 线的宽度
// kCGLineCapButt,
// kCGLineCapRound,
// kCGLineCapSquare
CGContextSetLineWidth(context, 5);
// 虚线模式
// (CGContextRef cg_nullable c,
// CGFloat phase, // 虚线的起始点
// const CGFloat * __nullable lengths, // 绘制片段 与 未绘制片段 交替
// size_t count)
//CGFloat a[] = { 1.0f, 2.0f, 30.0f };
//CGContextSetLineDash(context, 0, a , 3);
// 4、绘制
// kCGPathFill,
// kCGPathEOFill,
// kCGPathStroke,
// kCGPathFillStroke,
// kCGPathEOFillStroke
// 描边当前路径
[self track:context];
CGContextDrawPath(context, kCGPathFillStroke);
[self track:context];
// 便捷函数:
// CGContextFillPath(context)
// 描边当前路径
// CGContextStrokePath(context)
// CGContextEOFillPath(context)
// 描边指定矩形的内切圆
CGContextStrokeEllipseInRect(context, self.bounds);
// 画布上的路径被清空了吗
[self track:context];
// 用指定的线宽来描边矩形
CGContextStrokeRectWithWidth(context, CGRectInset(self.bounds, 30, 30), 10);
top = top+6.0*h;
CGPoint p3[6] = {
{left+w, top},
{left, top},
{left, top+h},
{left+w, top+h},
{left+w, top+2.0*h},
{left, top+2.0*h}
};
// 描边线段序列--指定起点、终点的成对的点,来描每一条线段。点1,点2组成一条线段,点3,点4组成一条线段,以此类推
CGContextStrokeLineSegments(context, p3, 6);
// 描边指定矩形
CGContextStrokeRect(context, CGRectInset(self.bounds, 60, 60));
// 画布上的路径被清空了
[self track:context];
}
-(void)arc{
// 1,画布
CGContextRef context= UIGraphicsGetCurrentContext();
// 2、设置
[[UIColor redColor] set];
// 3、路径
CGContextBeginPath(context);
CGContextAddArc(context, 160, 230, 100, 0, 2*M_PI, 1);
CGContextClosePath(context);
// 4、绘制
CGContextStrokePath(context);
}
-(void)track:(CGContextRef)context {
// 测试一下画布上有没有路径, 或者说画布有没有被清空
CGPoint point= CGContextGetPathCurrentPoint(context);
CGRect rect= CGContextGetPathBoundingBox(context);
NSLog(@"%@, %@", NSStringFromCGRect(rect), NSStringFromCGPoint(point));
}
@end