圖形上下文狀態(tài)棧與矩陣操作

圖形上下文狀態(tài)棧與矩陣操作

矩陣操作(關(guān)注核心代碼即可)

// 獲取上下文
    CGContextRef ctx = UIGraphicsGetCurrentContext();

// 核心代碼——給上下文做形變(在渲染前操作,對圖形上下文進(jìn)行操作,而不是對繪制的圖形進(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);

//核心代碼—— 保存以后會用到的狀態(tài)(在修改狀態(tài)前)
    CGContextSaveGState(ctx);

    // 設(shè)置上下文的狀態(tài)
    // 顏色
    [[UIColor redColor] set];
    // 設(shè)置線寬
    CGContextSetLineWidth(ctx, 5);
    CGContextSetLineCap(ctx, kCGLineCapRound);

    // 4.渲染路徑,在渲染之前會查看下當(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);
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容