03-图形上下文栈, 图形的平移 旋转 缩放

图形上下文栈存储着图形的现有的绘画状态,如果有需求,在同一个View中画不同粗细的线,就需要保存两份绘画状态,每份绘画状态保存一种属性

- (void)drawRect:(CGRect)rect {
    // Drawing code
    
    // 需求: 先画一个矩形,颜色为红色,线宽为3
    //       再画一个矩形,颜色为黑色,线宽为默认
    
    // 上下文
    CGContextRef ctx = UIGraphicsGetCurrentContext();
    
    // 保存一个当前上下文的绘图状态到一个栈里面
    // G代理Graphics[绘图]
    CGContextSaveGState(ctx);
    CGContextSaveGState(ctx);
    
    // 画红色,线宽为3的矩形
    [[UIColor redColor] set];
    CGContextSetLineWidth(ctx, 5);
    CGContextAddRect(ctx, CGRectMake(10, 10, 100, 100));
    CGContextStrokePath(ctx);
    
    // 画黑色,线宽为默认的矩形
//    [[UIColor blackColor] set];
//    CGContextSetLineWidth(ctx, 1);
    
    // 恢复 当前上下文的状态
    CGContextRestoreGState(ctx);
    
    CGContextAddRect(ctx, CGRectMake(10, 120, 50, 50));
    CGContextStrokePath(ctx);
    
    //再恢复
#warning 恢复状态不能随便调用,保存了多少次绘图状态,就可以调用多少
    CGContextRestoreGState(ctx);
    
    
    
}

 平移 旋转 缩放,注意做图形的旋转平移缩放需要再画之前做。不然不生效

- (void)drawRect:(CGRect)rect {
    // Drawing code
    //矩阵操作 平移、绽放,旋转
    
    // 画个三角形 + 画一条线
    
    CGContextRef ctx = UIGraphicsGetCurrentContext();
    
#warning qurtz2d的平移,要在绘制之前
    //平移
//    CGContextTranslateCTM(ctx, 0,50);
    
    //缩放
//    CGContextScaleCTM(ctx, 1.5, 1.5);
    
    //旋转
    // 负数 逆时针/ 正数 顺时针
    // 围绕左上角(0,0) 旋转
    CGContextRotateCTM(ctx, - M_PI * 0.2);

    // 定义三个点
//    CGPoint points[3] = {{50,20},{100,80},{10,80}};
//    CGContextAddLines(ctx, points, 3);
//    
//    // 合并三个点的路径
//    CGContextClosePath(ctx);
//    
    
//    // 画线
    CGPoint linePoints[2] = {{0,0},{80,80}};
    CGContextAddLines(ctx, linePoints, 2);
    CGContextStrokePath(ctx);
    

    
    // 渲染
    CGContextStrokePath(ctx);
}
原文地址:https://www.cnblogs.com/XXxiaotaiyang/p/5027279.html