CoreGraphics/QuartZ

参考文档1
参考文档2
参考文档3
参考文档4

  1. OS支持两套图形API族:Core Graphics/QuartZ 2D 和OpenGL ES。
    OpenGL ES是跨平台的图形API,属于OpenGL的一个简化版本。
    QuartZ 2D是苹果公司开发的一套API,它是Core Graphics Framework的一部分。
  1. OpenGL ES是应用程序编程接口,该接口描述了方法、结构、函数应具有的行为以及应该如何被使用的语义。也就是说它只定义了一套规范,具体的实现由设备制造商根据规范去做。
  2. drawRect 被调用
    a.
    -[DrawLineViewcontroller loadView]
    -[DrawLineViewcontroller viewDidLoad]
    -[DrawLineViewcontroller viewWillAppear:]
    -[DrawLineView drawRect:]
    -[DrawLineViewcontroller viewDidAppear:]
    b.
    调用view的setNeedsDisPlay或setNeedsDisplayInRect:时
    c.
    sizeToFit:

下面的示例代码仅罗列了极为简单的示例

- (void)drawRect:(CGRect)rect {

#pragma mark - 绘制基本图形
    
    // 在drawRect方法中调用UIGraphicsGetCurrentContext方法获取出来的就是Layer的上下文
    CGContextRef context = UIGraphicsGetCurrentContext();
    
    // 绘图(绘制直线), 保存绘图信息
    // 设置起点
    CGContextMoveToPoint(context, 50, 100);
    // 设置终点
    CGContextAddLineToPoint(context, 100, 100);
    
    // 设置线条颜色 红色
    CGContextSetRGBStrokeColor(context, 1.0, 0, 0, 1.0);
    // 设置线条宽度
    CGContextSetLineWidth(context, 10);
    
    // 设置线条的起点和终点的样式
    CGContextSetLineCap(context, kCGLineCapRound);
    // 设置线条的转角的样式
    CGContextSetLineJoin(context, kCGLineJoinRound);
    // 绘制一条线
    CGContextStrokePath(context);
    
    //绘制第二条线
    CGContextMoveToPoint(context, 150, 200);
    //设置第二系线的终点
    CGContextAddLineToPoint(context, 50, 100);
    //设置第二条线颜色
    CGContextSetRGBStrokeColor(context, 0, 1.0, 0, 1.0);
    //绘制
    CGContextStrokePath(context);
    
    //绘制三角形
    CGContextMoveToPoint(context, 50, 50);
    CGContextAddLineToPoint(context, 100, 100);
    CGContextAddLineToPoint(context, 150, 100);
    CGContextClosePath(context);
    CGContextStrokePath(context);
    
    //绘制圆
    CGContextSetLineWidth(context, 2);
    CGContextAddEllipseInRect(context, CGRectMake(200, 200, 10, 10));
    [[UIColor orangeColor] set];
    CGContextFillPath(context);//实心圆
    //CGContextStrokePath(context);//空心圆
    
    //绘制矩形
    CGContextAddRect(context, CGRectMake(10, 10, 50, 50));
    [[UIColor colorWithRed:1.0 green:0 blue:0 alpha:1] set];
    //CGContextStrokePath(context);
    CGContextFillPath(context);
    
    //绘制圆弧                  圆心    半径  开始弧度  结束弧度 0表顺针
    CGContextAddArc(context, 100, 100, 50, -M_PI_2, M_PI_2, 0);
    CGContextStrokePath(context);
    
    //绘制饼图
    //画线
    CGContextMoveToPoint(context, 100, 300);
    CGContextAddLineToPoint(context, 100, 150);
    //画弧
    CGContextAddArc(context, 100, 300, 50, M_PI_2, M_PI, 0);
    //并闭路径
    CGContextClosePath(context);
    CGContextFillPath(context);
#pragma mark - 绘制图片或文字
    UIImage *image = [UIImage imageNamed:@"4.jpg"];
    NSString *str = @"Fuck the world";
    [image drawInRect:CGRectMake(0, 0, 300, 300)];
    [str drawAtPoint:CGPointMake(100,400) withAttributes:@{
                                                           NSFontAttributeName:[UIFont systemFontOfSize:20]
                                                           }];
}

或者

- (void)drawRect:(CGRect)rect {
    // Drawing code
    NSLog(@"%s",__func__);
    //1.获取上下文
    CGContextRef contextRef = UIGraphicsGetCurrentContext();
    //2.描述路径
    UIBezierPath * path = [UIBezierPath bezierPath];
    //起点
    [path moveToPoint:CGPointMake(10, 10)];
    //终点
    [path addLineToPoint:CGPointMake(100, 100)];
    //设置颜色
    [[UIColor whiteColor]setStroke];
    //3.添加路径
    CGContextAddPath(contextRef, path.CGPath);
    //显示路径
    CGContextStrokePath(contextRef);

 }
- (void)drawRect:(CGRect)rect {
    //1、获取当前上下文
    CGContextRef  contextRef = UIGraphicsGetCurrentContext();
    //2.描述路径
    //ArcCenter:中心点
    //radius:半径
    //startAngle:起始角度
    //endAngle:结束角度
    //clockwise:是否逆时针
    UIBezierPath * path = [UIBezierPath bezierPathWithArcCenter:CGPointMake(self.bounds.size.width*0.5, self.bounds.size.height*0.5) radius:self.bounds.size.width*0.4 startAngle:0 endAngle:M_PI*2 clockwise:NO];
    //3.添加路径到上下文
    CGContextAddPath(contextRef, path.CGPath);
    //4.设置颜色
    [[UIColor brownColor]setFill];
    //4.显示上下文 显示一个实心圆
    //CGContextFillPath(contextRef);
    //显示一个空心圆,描边
    CGContextStrokePath(contextRef);
}

画三条不同颜色的线

    //1 获取上下文
    //分别设置线段的颜色
    CGContextRef purple = UIGraphicsGetCurrentContext();
    [[UIColor purpleColor]setStroke];
    CGContextSaveGState(purple);//存储上下文
    
    CGContextRef orange = UIGraphicsGetCurrentContext();
    [[UIColor orangeColor]setStroke];
    CGContextSaveGState(orange);
    
    CGContextRef green = UIGraphicsGetCurrentContext();
    [[UIColor greenColor]setStroke];
    CGContextSaveGState(green);
    
    
    UIBezierPath * path = [UIBezierPath bezierPath];
    //设置线宽
    path.lineWidth = 5;
    
    //把紫色的上下文从栈中取出来
    CGContextRestoreGState(purple);
    //第一条线
    [[UIColor purpleColor]setStroke];
    [path moveToPoint:CGPointMake(10, 10)];
    [path addLineToPoint:CGPointMake(10, 100)];
    [path stroke];
    
    
    //把紫色的上下文从栈中取出来
    CGContextRestoreGState(orange);
    path = [UIBezierPath bezierPath];
    //设置线宽
    path.lineWidth = 9;
    //第二条线
    [[UIColor orangeColor]setStroke];
    [path moveToPoint:CGPointMake(30, 10)];
    [path addLineToPoint:CGPointMake(30, 100)];
    [path stroke];
    
    //把紫色的上下文从栈中取出来
    CGContextRestoreGState(green);
    path = [UIBezierPath bezierPath];
    //设置线宽
    path.lineWidth = 3;
    //第三条线
    [[UIColor greenColor]setStroke];
    [path moveToPoint:CGPointMake(50, 10)];
    [path addLineToPoint:CGPointMake(50, 100)];
    [path stroke];

你可能感兴趣的:(CoreGraphics/QuartZ)