圖形上下文狀態(tài)棧與矩陣操作
矩陣操作(關(guān)注核心代碼即可)
// 獲取上下文
CGContextRef ctx = UIGraphicsGetCurrentContext();
// 核心代碼——給上下文做形變(在渲染前操作,對(duì)圖形上下文進(jìn)行操作,而不是對(duì)繪制的圖形進(jìn)行操作)
// 平移
CGContextTranslateCTM(ctx, 100, 100);
// 旋轉(zhuǎn)
CGContextRotateCTM(ctx, M_PI_4);
// 縮放
CGContextScaleCTM(ctx, 0.5, 0.5);
// 拼接路徑
UIBezierPath *path = [UIBezierPath bezierPathWithOvalInRect:CGRectMake(-50, -100, 100, 200)];
// 設(shè)置繪圖狀態(tài)
[[UIColor redColor] set];
// 渲染
[path fill];
圖形上下文狀態(tài)棧(關(guān)注核心代碼即可)
// 1.獲取上下文
CGContextRef ctx = UIGraphicsGetCurrentContext();
// 2.拼接路徑——畫第一根線
UIBezierPath *path = [UIBezierPath bezierPath];
[path moveToPoint:CGPointMake(10, 125)];
[path addLineToPoint:CGPointMake(240, 125)];
// 3.把路徑添加到上下文
CGContextAddPath(ctx, path.CGPath);
//核心代碼—— 保存以后會(huì)用到的狀態(tài)(在修改狀態(tài)前)
CGContextSaveGState(ctx);
// 設(shè)置上下文的狀態(tài)
// 顏色
[[UIColor redColor] set];
// 設(shè)置線寬
CGContextSetLineWidth(ctx, 5);
CGContextSetLineCap(ctx, kCGLineCapRound);
// 4.渲染路徑,在渲染之前會(huì)查看下當(dāng)前上下文的狀態(tài),根據(jù)狀態(tài)去渲染
CGContextStrokePath(ctx);
// 描述第二根線
path = [UIBezierPath bezierPath];
[path moveToPoint:CGPointMake(125, 10)];
[path addLineToPoint:CGPointMake(125, 240)];
// 添加到上下文
CGContextAddPath(ctx, path.CGPath);
//核心代碼—— 還原狀態(tài),從之前的棧里面取出狀態(tài)替換掉當(dāng)前狀態(tài)
CGContextRestoreGState(ctx);
// 相當(dāng)于將上面的設(shè)置上下文狀態(tài)的改為下面三句代碼:
// [[UIColor blackColor] set];
// CGContextSetLineWidth(ctx, 1);
// CGContextSetLineCap(ctx, kCGLineCapSquare);
// 渲染第二根線
CGContextStrokePath(ctx);