富文本繪制 之Quartz 2D

    NSString *title =[NSString stringWithFormat:@"%@",@"繪制文字"];
    NSDictionary *titDic = @{NSForegroundColorAttributeName:[UIColor redColor],
                             NSFontAttributeName:[UIFont systemFontOfSize:14.0]
    };
    //富文本樣式
    NSMutableAttributedString *attributeTitle = [[NSMutableAttributedString alloc] initWithString:title attributes:titDic];
    //設(shè)置frame
    CTFramesetterRef titFrameSetterRef = CTFramesetterCreateWithAttributedString((CFAttributedStringRef)attributeTitle);
    
    //獲取繪制高度
    CGFloat viewW = self.view.bounds.size.width;
    CGSize reSize = CGSizeMake(viewW, 10000); //預(yù)估的繪制范圍,但是 hight=10000 必須是具體的數(shù)值,系統(tǒng)可以形成一個(gè)具體的矩形塊,否則高度會(huì)不準(zhǔn)
    //繪制的尺寸
    CGSize titSize = CTFramesetterSuggestFrameSizeWithConstraints(titFrameSetterRef, CFRangeMake(0, 0), NULL, reSize, NULL);

    CGRect titRect = CGRectMake(0, 0, viewW, titSize.height);
    //繪制路徑
    CGPathRef titPathRef = CGPathCreateWithRect(titRect, NULL);
    CTFrameRef frameRef = CTFramesetterCreateFrame(titFrameSetterRef, CFRangeMake(0, 0), titPathRef, NULL);

    //獲取畫(huà)布
    CGContextRef contextRef = UIGraphicsGetCurrentContext();
    CGContextSetTextMatrix(contextRef, CGAffineTransformIdentity);
    
    //坐標(biāo)系轉(zhuǎn)換 繪制的時(shí)候 CT是以左上角為原點(diǎn)(0,0) Y軸向下 設(shè)備顯示Y軸向上所以要改變坐標(biāo)系
    
    //平移坐標(biāo)系 x軸平移0 y軸平移titSize.height
    CGContextTranslateCTM(contextRef, 0, titSize.height);
    
    //縮放坐標(biāo)軸 x軸方向縮放1.0 y軸縮放-1.0 即x坐標(biāo)乘1.0 y坐標(biāo)乘-1.0 坐標(biāo)軸是反轉(zhuǎn)的
    CGContextScaleCTM(contextRef, 1.0, -1.0);

    //繪制文字
    CTFrameDraw(frameRef, contextRef);

    //釋放創(chuàng)建的對(duì)象
    CFRelease(titFrameSetterRef);
    CGPathRelease(titPathRef);
    CFRelease(frameRef);

//還有旋轉(zhuǎn)坐標(biāo)系
- void CGContextRotateCTM ( CGContextRef c, CGFloat angle ):旋轉(zhuǎn)坐標(biāo)系統(tǒng)。

該方法控制坐標(biāo)系統(tǒng)旋轉(zhuǎn) angle 弧度。在縮放后的坐標(biāo)系統(tǒng)上繪制圖形時(shí),所有坐標(biāo)點(diǎn)的 X、Y 坐標(biāo)都相當(dāng)于旋轉(zhuǎn)了 angle弧度之后的坐標(biāo)。
為了讓開(kāi)發(fā)者在進(jìn)行坐標(biāo)變換時(shí)無(wú)須計(jì)算多次坐標(biāo)變換后的累加結(jié)果,Quartz 2D還提供了如下兩個(gè)方法來(lái)保存、恢復(fù)繪圖狀態(tài)。
- void CGContextSaveGState ( CGContextRef c ):保存當(dāng)前的繪圖狀態(tài)。 
- void CGContextRestoreGState ( CGContextRef c ):恢復(fù)之前保存的繪圖狀態(tài)。

需要說(shuō)明的是,CGContextSaveGState() 函數(shù)保存的繪圖狀態(tài),不僅包括當(dāng)前坐標(biāo)系統(tǒng)的狀態(tài),也包括當(dāng)前設(shè)置的填充風(fēng)格、線條風(fēng)格、陰影風(fēng)格等各種繪圖狀態(tài)。但 CGContextSaveGState() 函數(shù)不會(huì)保存當(dāng)前繪制的圖形。

這些基本夠平時(shí)使用的
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容