图形上下文栈存储着图形的现有的绘画状态,如果有需求,在同一个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); }