Quartz 2D 绘制直线

196 阅读2分钟

绘制步骤

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  效果一样,为什么要取不通的名字,或者是又不一样的地方我忽略了。

求解惑。