绘制步骤
1.获取上下文 : -UIGraphicsGEtCurrentContext()
2.创建和设置路径 (path)
-2.1 创建路径
-2.2 设置路径起点
-2.3 设置路径终点、内容
3.添加路径到上下文
4.设置上下文状态
5.绘制路径
6.释放路径
说明: Quartz 2d 是Core Graphic 框架下的 关于c 语言的 Api 接口,所以后很多东西都是和Core Graphic 公用的。所以很多前缀都是用CG 开头,另外这个文章 写的是路径 所以都会有path 。因为是C语言的 所以都是没有像oc 那样的 创建对象 ,没有星号
- (void)drawRect:(CGRect)rect {
// Drawing code
// 1.获取上下文
CGContextRef contxt = UIGraphicsGetCurrentContext() ;
// 2.创建路径
CGMutablePathRef path = CGPathCreateMutable() ;
// 第一个参数是 创建的路径 第二个是 形变 先不管 ,第三四个 参数是 X和 Y
CGPathMoveToPoint(path, NULL, 50, 50);
CGPathAddLineToPoint(path, NULL, 300, 50);
// CGPathAddLineToPoint(path, NULL, 50, 300);
CGPathCloseSubpath(path) ;
// CGContextMoveToPoint(contxt, 50, 50 );
// CGContextAddLineToPoint(contxt, 300, 300) ;
// CGContextClosePath(contxt);
// 3.添加路径
CGContextAddPath(contxt, path);
// 4.添加属性。 颜色跟alpha 同时设置 会使得性能下降 10 和10.0f是有差别的
// FillColor 是存在闭合图像的时候 所需要的填充颜色 ;
// 而StrokeColor 是线条颜色
CGContextSetRGBStrokeColor(contxt, 1.0, 0.0, 0.0, 1.0);
//画线颜色
CGContextSetRGBFillColor(contxt, 0.0, 0.3f, 0.8f, 0.4f);
// 填充颜色
CGContextSetLineWidth(contxt, 2 );
CGContextSetLineCap(contxt, kCGLineCapSquare);
// 顶点样式
// kCGLineCapButt, 凹角
// kCGLineCapRound, 圆角
// kCGLineCapSquare。平角
CGContextSetLineJoin(contxt, kCGLineJoinBevel);
// kCGLineJoinMiter, 尖角度
// kCGLineJoinRound, 圆角
// kCGLineJoinBevel 平角
CGFloat lengths[] = {5 ,10 };
// lengths 的数组在别等文章说是 先画 5个点 再空10个点,再画5个点
//可实际上代码我的效果是实线和空格是一样的宽度, 也就是0-5 是实线,5-10 是虚线,
另外关于如果有三个数字,又是另一个状态, 还望知道看到这篇文章并且懂得的人 留言解惑
// contex 上下文
// phase 相位 偏移量
// lengthes 数组
// count 数组的个数
CGContextSetLineDash(contxt, 0, lengths, 2);
// 5.绘制
CGContextDrawPath(contxt, kCGPathStroke);
// 6.释放对象。因为是c 语言 用creat 或者copy 的 都是需要手动释放
CGPathRelease(path) ;
}
//typedef CF_ENUM (int32_t, CGPathDrawingMode) {
// kCGPathFill, 填充
// kCGPathEOFill,
// kCGPathStroke, 画线
// kCGPathFillStroke, 填充加画线
// kCGPathEOFillStroke。//
};
疑惑: // lengths 的数组在别等文章说是 先画 5个点 再空10个点,再画5个点
//可实际上代码我的效果是实线和空格是一样的宽度, 也就是0-5 是实线,5-10 是虚线,
另外关于如果有三个数字,又是另一个状态, 还望知道看到这篇文章并且懂得的人 留言解惑;另外就是CGPathDrawingMode 填充状态有几个状态带of 的 ,跟其他的效果一样,是为什么呢:kCGPathFill 和kCGPathEOFill 效果一样,为什么要取不通的名字,或者是又不一样的地方我忽略了。求解惑。
网友评论