IOS開發基礎系列 Core Text

API接口文檔

1 CoreText.framework簡介

1.1 常用類庫

CoreText 框架中最常用的幾個類:

1 CTFont

2 CTFontCollection

3 CTFontDescriptor

4 CTFrame

5 CTFramesetter

6 CTGlyphInfo

7 CTLine

8 CTParagraphStyle

9 CTRun

10 CTTextTab

11 CTTypesetter

1.1.1 CTFrame整體視窗組合圖

先來了解一下該框架的整體視窗組合圖:

CTFrame 作為一個整體的畫布(Canvas),其中由行(CTLine)組成,而每行可以分為一個或多個小方塊(CTRun)。

注意:你不需要自己創建CTRun,Core Text將根據NSAttributedString的屬性來自動創建CTRun。每個CTRun對象對應不同的屬性,正因此,你可以自由的控制字體、顏色、字間距等等信息。

通常處理步聚:

1.使用core text就是先有一個要顯示的string,然后定義這個string每個部分的樣式->attributedString -> 生成 CTFramesetter -> 得到CTFrame -> 繪制(CTFrameDraw)

其中可以更詳細的設置換行方式,對齊方式,繪制區域的大小等。

2.繪制只是顯示,點擊事件就需要一個個判斷了。

CTFrame 包含了多個CTLine,并且可以得到各個line的真實位置與大小。判斷點擊處在不在某個line上。CTLine 又可以判斷這個點(相對于ctline的坐標)處的文字范圍。然后遍歷這個string的所有NSTextCheckingResult,根據result的rang判斷點擊處在不在這個rang上,從而得到點擊的鏈接與位置。

1.1.2 字體的基本知識

字體(Font):是一系列字號、樣式和磅值相同的字符(例如:10磅黑體Palatino)。現多被視為字樣的同義詞。
字面(Face):是所有字號的磅值和格式的綜合。
字體集(Font family):是一組相關字體(例如:Franklin family包括Franklin Gothic、Fran-klinHeavy和FranklinCompressed)。
磅值(Weight):用于描述字體粗度。典型的磅值,從最粗到最細,有極細、細、book、中等、半粗、粗、較粗、極粗。
樣式(Style):字形有三種形式:Roman type是直體;oblique type是斜體;utakuc type是斜體兼曲線(比Roman type更像書法體)。
x高度(X height):指小寫字母的平均高度(以x為基準)。磅值相同的兩字母,x高度越大的字母看起來比x高度小的字母要大。
Cap高度(Cap height):與x高度相似。指大寫字母的平均高度(以C為基準)。
下行字母(Descender):例如在字母q中,基線以下的字母部分叫下伸部分。
上行字母(Ascender):x高度以上的部分(比如字母b)叫做上伸部分。
基線(Baseline):通常在x、v、b、m下的那條線。
描邊(Stroke):組成字符的線或曲線。可以加粗或改變字符形狀。
襯線(Serif):用來使字符更可視的一條水平線。如字母左上角和下部的水平線。
無襯線(Sans Serif):可以讓排字員不使用襯線裝飾。
方形字(Block):這種字體的筆畫使字符看起來比無襯線字更顯眼,但還不到常見的襯線字的程度。例如Lubalin Graph就是方形字,這種字看起來好像是木頭塊刻的一樣。
手寫體腳本(Calligraphic script):是一種仿效手寫體的字體,例如Murray Hill或者Fraktur字體。
藝術字(Decorative):像繪畫般的字體。
Pi符號(Pisymbol):非標準的字母數字字符的特殊符號,例如Wingdings和MathematicalPi。
連寫(Ligature):是一系列連寫字母如fi、fl、ffi或ffl。由于字些字母形狀的原因經常被連寫,故排字員已習慣將它們連寫。

1.1.3 字符屬性名稱

const CFStringRef kCTCharacterShapeAttributeName;
// 字體形狀屬性 必須是CFNumberRef對象默認為0,非0則對應相應的字符形狀定義,如1表示傳統字符形狀

const CFStringRef kCTFontAttributeName;
// 字體屬性 必須是CTFont對象

const CFStringRef kCTKernAttributeName;
// 字符間隔屬性 必須是CFNumberRef對象

const CFStringRef kCTLigatureAttributeName;
// 設置是否使用連字屬性,設置為0,表示不使用連字屬性。標準的英文連字有FI,FL.默認值為1,既是使用標準連字。也就是當搜索到f時候,會把fl當成一個文字。必須是CFNumberRef 默認為1,可取0,1,2

const CFStringRef kCTForegroundColorAttributeName;
// 字體顏色屬性 必須是CGColor對象,默認為black

const CFStringRef kCTForegroundColorFromContextAttributeName;
// 上下文的字體顏色屬性 必須為CFBooleanRef 默認為False,

const CFStringRef kCTParagraphStyleAttributeName;
// 段落樣式屬性 必須是CTParagraphStyle對象 默認為NIL

const CFStringRef kCTStrokeWidthAttributeName;
// 筆畫線條寬度 必須是CFNumberRef對象,默為0.0f,標準為3.0f

const CFStringRef kCTStrokeColorAttributeName;
// 筆畫的顏色屬性 必須是CGColorRef 對象,默認為前景色

const CFStringRef kCTSuperscriptAttributeName;
// 設置字體的上下標屬性 必須是CFNumberRef對象 默認為0,可為-1為下標,1為上標,需要字體支持才行。如排列組合的樣式Cn1

const CFStringRef kCTUnderlineColorAttributeName;
// 字體下劃線顏色屬性 必須是CGColorRef對象,默認為前景色

const CFStringRef kCTUnderlineStyleAttributeName
// 字體下劃線樣式屬性 必須是CFNumberRef對象,默為kCTUnderlineStyleNone 可以通過CTUnderlineStypleModifiers 進行修改下劃線風格

const CFStringRef kCTVerticalFormsAttributeName;
// 文字的字形方向屬性 必須是CFBooleanRef 默認為false,false表示水平方向,true表示豎直方向

const CFStringRef kCTGlyphInfoAttributeName;
// 字體信息屬性 必須是CTGlyphInfo對象

const CFStringRef kCTRunDelegateAttributeName
// CTRun 委托屬性 必須是CTRunDelegate對象

1.2 段落樣式CTParagraphStyle

1.2.1 段落樣式定義

kCTParagraphStyleSpecifierAlignment = 0, // 對齊屬性
kCTParagraphStyleSpecifierFirstLineHeadIndent = 1, // 首行縮進
kCTParagraphStyleSpecifierHeadIndent = 2, // 段頭縮進
kCTParagraphStyleSpecifierTailIndent = 3, // 段尾縮進
kCTParagraphStyleSpecifierTabStops = 4, // 制表符模式
kCTParagraphStyleSpecifierDefaultTabInterval = 5, // 默認tab間隔
kCTParagraphStyleSpecifierLineBreakMode = 6, // 換行模式
kCTParagraphStyleSpecifierLineHeightMultiple = 7, // 多行高
kCTParagraphStyleSpecifierMaximumLineHeight = 8, // 最大行高
kCTParagraphStyleSpecifierMinimumLineHeight = 9, // 最小行高
kCTParagraphStyleSpecifierLineSpacing = 10, // 行距
kCTParagraphStyleSpecifierParagraphSpacing = 11, // 段落間距 在段的未尾(Bottom)加上間隔,這個值為負數。
kCTParagraphStyleSpecifierParagraphSpacingBefore = 12, // 段落前間距 在一個段落的前面加上間隔。TOP
kCTParagraphStyleSpecifierBaseWritingDirection = 13, // 基本書寫方向
kCTParagraphStyleSpecifierMaximumLineSpacing = 14, // 最大行距
kCTParagraphStyleSpecifierMinimumLineSpacing = 15, // 最小行距
kCTParagraphStyleSpecifierLineSpacingAdjustment = 16, // 行距調整
kCTParagraphStyleSpecifierCount = 17, //

1.2.2 對齊屬性kCTParagraphStyleSpecifierAlignment

kCTLeftTextAlignment = 0, // 左對齊
kCTRightTextAlignment = 1, // 右對齊
kCTCenterTextAlignment = 2, // 居中對齊
kCTJustifiedTextAlignment = 3, // 文本對齊
kCTNaturalTextAlignment = 4 // 自然文本對齊
// 段落默認樣式為 kCTNaturalTextAlignment

// 對齊方式設置代碼:
CTTextAlignment alignment = kCTJustifiedTextAlignment;
CTParagraphStyleSetting alignmentStyle;
alignmentStyle.spec = kCTParagraphStyleSpecifierAlignment;// 指定為對齊屬性
alignmentStyle.valueSize = sizeof(alignment);
alignmentStyle.value=&alignment;

1.2.3 首行縮進屬性 kCTParagraphStyleSpecifierFirstLineHeadIndent

// 首行縮進代碼:

// 首行縮進
CGFloat fristlineindent = 24.0f;
CTParagraphStyleSetting fristline;
fristline.spec = kCTParagraphStyleSpecifierFirstLineHeadIndent;
fristline.value = &fristlineindent;
fristline.valueSize = sizeof(float);

1.2.4 段頭縮進kCTParagraphStyleSpecifierHeadIndent

// 段頭縮進代碼:

// 段縮進
CGFloat headindent = 10.0f;
CTParagraphStyleSetting head;
head.spec = kCTParagraphStyleSpecifierHeadIndent;
head.value = &headindent;
head.valueSize = sizeof(float);

1.2.5 段尾縮進kCTParagraphStyleSpecifierTailIndent

// 段尾縮進代碼:

CGFloat tailindent = 50.0f;
CTParagraphStyleSetting tail;
tail.spec = kCTParagraphStyleSpecifierTailIndent;
tail.value = &tailindent;
tail.valueSize = sizeof(float);

1.2.6 制表符kCTParagraphStyleSpecifierTabStops

// 制表符(tab)代碼:

CTTextAlignment tab_alignment = kCTJustifiedTextAlignment;
CTTextTabRef texttab = CTTextTabCreate(tab_alignment, 24, NULL);
CTParagraphStyleSetting tab;
tab.spec = kCTParagraphStyleSpecifierTabStops;
tab.value = &texttab;
tab.valueSize = sizeof(CTTextTabRef);

1.2.7 換行模式CTLineBreakMode

// 換行模式:
kCTLineBreakByWordWrapping = 0, // 出現在單詞邊界時起作用,如果該單詞不在能在一行里顯示時,整體換行。此為段的默認值
kCTLineBreakByCharWrapping = 1, // 當一行中最后一個位置的大小不能容納一個字符時,才進行換行。
kCTLineBreakByClipping = 2, // 超出畫布邊緣部份將被截除。
kCTLineBreakByTruncatingHead = 3, // 截除前面部份,只保留后面一行的數據。前部份以...代替。
kCTLineBreakByTruncatingTail = 4, // 截除后面部份,只保留前面一行的數據,后部份以...代替。
kCTLineBreakByTruncatingMiddle = 5 // 在一行中顯示段文字的前面和后面文字,中間文字使用...代替。

// 換行模式代碼:

CTParagraphStyleSetting lineBreakMode;
CTLineBreakMode lineBreak = kCTLineBreakByWordWrapping; // kCTLineBreakByCharWrapping;
lineBreakMode.spec = kCTParagraphStyleSpecifierLineBreakMode;
lineBreakMode.value = &lineBreak;
lineBreakMode.valueSize = sizeof(CTLineBreakMode);

1.2.8 多行高度設置kCTParagraphStyleSpecifierLineHeightMultiple

// 多行高設置代碼:

CGFloat MutiHeight = 10.0f;
CTParagraphStyleSetting Muti;
Muti.spec = kCTParagraphStyleSpecifierLineHeightMultiple;
Muti.value = &MutiHeight;
Muti.valueSize = sizeof(float);

1.2.9 最大行高設置kCTParagraphStyleSpecifierLineHeightMultiple

// 最大行高代碼:

CGFloat MaxHeight = 5.0f;
CTParagraphStyleSetting Max;
Max.spec = kCTParagraphStyleSpecifierLineHeightMultiple;
Max.value = &MaxHeight;
Max.valueSize = sizeof(float);

1.2.10 行距設置kCTParagraphStyleSpecifierLineSpacing

// 行距代碼:

CGFloat _linespace = 5.0f;
CTParagraphStyleSetting lineSpaceSetting;
lineSpaceSetting.spec = kCTParagraphStyleSpecifierLineSpacing;
lineSpaceSetting.value = &_linespace;
lineSpaceSetting.valueSize = sizeof(float);

1.2.11 段前間距設置kCTParagraphStyleSpecifierLineSpacing

段前間距設置代碼(段與段之間):

// 段前間隔
CGFloat paragraphspace = 5.0f;
CTParagraphStyleSetting paragraph;
paragraph.spec = kCTParagraphStyleSpecifierLineSpacing;
paragraph.value = graphspace;
paragraph.valueSize = sizeof(float);

1.2.12 基本書寫方向kCTParagraphStyleSpecifierBaseWritingDirection

// 基本書寫方向代碼:

CTWritingDirection wd = kCTWritingDirectionRightToLeft;
CTParagraphStyleSetting writedic;
writedic.spec = kCTParagraphStyleSpecifierBaseWritingDirection;
writedic.value = &wd;
writedic.valueSize = sizeof(CTWritingDirection);

1.3 使用舉例

1.3.1 示例

// 段落樣式
NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init];
// 行間距
paragraphStyle.lineSpacing = 10.0;
// 段落間距
// paragraphStyle.paragraphSpacing = 20.0;
// paragraphStyle.baseWritingDirection =NSWritingDirectionLeftToRight;
// paragraphStyle.firstLineHeadIndent = 10.0;
// paragraphStyle.headIndent = 50.0;
// paragraphStyle.tailIndent = 200.0;
[supportAttributeStraddAttribute:NSParagraphStyleAttributeName value: paragraphStylerange: NSMakeRange(0, supportAttributeStr.length)];

#pragma mark -如下代碼不行:
// CGFloat _linespace = 5.0f;
// CTParagraphStyleSetting lineSpaceSetting;
// lineSpaceSetting.spec = kCTParagraphStyleSpecifierLineSpacing;
// lineSpaceSetting.value = &_linespace;
// lineSpaceSetting.valueSize = sizeof(float);
// CTParagraphStyleSetting settings[] = {lineSpaceSetting};
// CTParagraphStyleRef paragraphStyle = CTParagraphStyleCreate(settings, 1); // 第二個參數為settings的長度
// NSMutableDictionary *attributes = [NSMutableDictionary dictionaryWithObject:(id)paragraphStyle forKey:(__bridgeNSString *)kCTParagraphStyleAttributeName];
// [supportAttributeStraddAttributes:attributes range:NSMakeRange(0, supportAttributeStr.length)];
// NSAttributedString*attributedString = [[NSAttributedString alloc] initWithData:[_htmlDatadataUsingEncoding:NSUnicodeStringEncoding]options:@{NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType} documentAttributes:nilerror:nil];

1.3.2 此示例貌似不行

NSMutableAttributedString *mabstring = [[NSMutableAttributedString alloc] initWithString:@"This is a test of characterAttribute.中文字符"];
// 設置字體屬性
CTFontRef font = CTFontCreateWithName(CFSTR("Georgia"), 40, NULL);
[mabstring addAttribute:(id)kCTFontAttributeName value:(id)font range:NSMakeRange(0, 4)];
// 設置斜體字
CTFontRef font = CTFontCreateWithName((CFStringRef)[UIFont italicSystemFontOfSize:20].fontName, 14, NULL);
[mabstring addAttribute:(id)kCTFontAttributeName value:(id)font range:NSMakeRange(0, 4)];
// 下劃線
[mabstring addAttribute:(id)kCTUnderlineStyleAttributeName value:(id)[NSNumber numberWithInt: kCTUnderlineStyleDouble] range:NSMakeRange(0, 4)];
// 下劃線顏色
[mabstring addAttribute:(id)kCTUnderlineColorAttributeName value:(id)[UIColor redColor].CGColor range:NSMakeRange(0, 4)];
// 設置字體簡隔
long number = 10;
CFNumberRef num = CFNumberCreate(kCFAllocatorDefault,kCFNumberSInt8Type,&number);
[mabstring addAttribute:(id)kCTKernAttributeName value:(id)num range:NSMakeRange(10, 4)];
// 設置連字
longnumber = 1;
CFNumberRef num = CFNumberCreate(kCFAllocatorDefault,kCFNumberSInt8Type,&number);
[mabstring addAttribute:(id)kCTLigatureAttributeName value:(id)num range: NSMakeRange(0, [str length])];
// 連字還不會使用,未看到效果。
// 設置字體顏色
[mabstring addAttribute:(id)kCTForegroundColorAttributeName value:(id)[UIColor redColor].CGColor range:NSMakeRange(0, 9)];
// 設置字體顏色為前影色
CFBooleanRef flag = kCFBooleanTrue;
[mabstring addAttribute:(id)kCTForegroundColorFromContextAttributeName value:(id)flag range:NSMakeRange(5, 10)];
// 無明顯效果

// 設置空心字
long number = 2;
CFNumberRef num = CFNumberCreate(kCFAllocatorDefault,kCFNumberSInt8Type,&number);
[mabstring addAttribute:(id)kCTStrokeWidthAttributeName value:(id)num range: NSMakeRange(0, [str length])];
// 設置空心字顏色
[mabstring addAttribute:(id)kCTStrokeColorAttributeName value:(id)[UIColor greenColor].CGColor range:NSMakeRange(0, [str length])];
// 在設置空心字顏色時,必須先將字體高為空心,否則設置顏色是沒有效果的。
// 對同一段字體進行多屬性設置
// 紅色
NSMutableDictionary *attributes = [NSMutableDictionary dictionaryWithObject:(id)[UIColor redColor].CGColor forKey:(id)kCTForegroundColorAttributeName];

// 斜體
CTFontRef font = CTFontCreateWithName((CFStringRef)[UIFont italicSystemFontOfSize: 20].fontName, 40, NULL);
[attributes setObject:(id)font forKey:(id)kCTFontAttributeName];

// 下劃線
[attributes setObject:(id)[NSNumber numberWithInt:kCTUnderlineStyleDouble] forKey:(id)kCTUnderlineStyleAttributeName];
[mabstring addAttributes:attributes range:NSMakeRange(0, 4)];

1.4 繪制示例代碼

最后就是draw方法

-(void)characterAttribute
{
    NSString *str = @"This is a test of characterAttribute.中文字符";
    NSMutableAttributedString *mabstring = [[NSMutableAttributedString alloc] initWithString: str];
    [mabstring beginEditing];

    long number = 1;
    CFNumberRef num = CFNumberCreate(kCFAllocatorDefault, kCFNumberSInt8Type, &number);
    [mabstring addAttribute:(id)kCTCharacterShapeAttributeName value:(id)num range: NSMakeRange(0, 4)];

    // 設置字體屬性
    CTFontRef font = CTFontCreateWithName(CFSTR("Georgia"), 40, NULL);
    [mabstring addAttribute:(id)kCTFontAttributeName value:(id)font range:NSMakeRange(0, 4)];

    // 設置字體簡隔
    long number = 10;
    CFNumberRef num = CFNumberCreate(kCFAllocatorDefault, kCFNumberSInt8Type, &number); 
    [mabstring addAttribute:(id)kCTKernAttributeName value:(id)num range:NSMakeRange(10, 4)];

    long number = 1;
    CFNumberRef num = CFNumberCreate(kCFAllocatorDefault, kCFNumberSInt8Type, &number);
    [mabstring addAttribute:(id)kCTLigatureAttributeName value:(id)num range: NSMakeRange(0, [str length])];

    // 設置字體顏色
    [mabstring addAttribute:(id)kCTForegroundColorAttributeName value:(id)[UIColor redColor].CGColor range:NSMakeRange(0, 9)];

    // 設置字體顏色為前影色
    CFBooleanRef flag = kCFBooleanTrue;
    [mabstring addAttribute:(id)kCTForegroundColorFromContextAttributeName value:(id)flag range:NSMakeRange(5, 10)];

    // 設置空心字
    long number = 2;
    CFNumberRef num = CFNumberCreate(kCFAllocatorDefault, kCFNumberSInt8Type, &number);
    [mabstring addAttribute:(id)kCTStrokeWidthAttributeName value:(id)num range: NSMakeRange(0, [str length])];
    
     // 設置空心字顏色
    [mabstring addAttribute:(id)kCTStrokeColorAttributeName value:(id)[UIColor greenColor].CGColor range:NSMakeRange(0, [str length])];

    long number = 1;
    CFNumberRef num = CFNumberCreate(kCFAllocatorDefault, kCFNumberSInt8Type, &number);
    [mabstring addAttribute:(id)kCTSuperscriptAttributeName value:(id)num range:NSMakeRange(3, 1)];
    
    // 設置斜體字
    CTFontRef font = CTFontCreateWithName((CFStringRef)[UIFont italicSystemFontOfSize: 20].fontName, 14, NULL);
    [mabstring addAttribute:(id)kCTFontAttributeName value:(id)font range:NSMakeRange(0, 4)];
    
    // 下劃線
    [mabstring addAttribute:(id)kCTUnderlineStyleAttributeName value:(id)[NSNumber numberWithInt: kCTUnderlineStyleDouble] range:NSMakeRange(0, 4)];

    // 下劃線顏色
    [mabstring addAttribute:(id)kCTUnderlineColorAttributeName value:(id)[UIColor redColor].CGColor range:NSMakeRange(0, 4)];

    // 對同一段字體進行多屬性設置
    // 紅色
    NSMutableDictionary *attributes = [NSMutableDictionary dictionaryWithObject:(id)[UIColor redColor].CGColor forKey:(id)kCTForegroundColorAttributeName];
    // 斜體
    CTFontRef font = CTFontCreateWithName((CFStringRef)[UIFont italicSystemFontOfSize: 20].fontName, 40, NULL);
    [attributes setObject:(id)font forKey:(id)kCTFontAttributeName];
    // 下劃線
    [attributes setObject:(id)[NSNumber numberWithInt:kCTUnderlineStyleDouble] forKey:(id)kCTUnderlineStyleAttributeName];
    [mabstring addAttributes:attributes range:NSMakeRange(0, 4)];
    
    NSRange kk = NSMakeRange(0, 4);
    NSDictionary * dc = [mabstring attributesAtIndex:0 effectiveRange:&kk];
    [mabstring endEditing];
    NSLog(@"value = %@",dc);
    CTFramesetterRef framesetter = CTFramesetterCreateWithAttributedString((CFAttributedStringRef)mabstring);
    CGMutablePathRef path = CGPathCreateMutable();
    CGPathAddRect(path, NULL , CGRectMake(10, 0, self.bounds.size.width-10, self.bounds.size.height-10));
    CTFrameRef frame = CTFramesetterCreateFrame(framesetter, CFRangeMake(0, 0), path, NULL);
    
    // 獲取當前(View)上下文以便于之后的繪畫,這個是一個離屏。
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSetTextMatrix(context , CGAffineTransformIdentity);
    // 壓棧,壓入圖形狀態棧中.每個圖形上下文維護一個圖形狀態棧,并不是所有的當前繪畫環境的圖形狀態的元素都被保存。圖形狀態中不考慮當前路徑,所以不保存
    // 保存現在得上下文圖形狀態。不管后續對context上繪制什么都不會影響真正的屏幕。
    CGContextSaveGState(context);
    
    // x,y軸方向移動
    CGContextTranslateCTM(context, 0, self.bounds.size.height);
    // 縮放x,y軸方向縮放,-1.0為反向1.0倍,坐標系轉換,沿x軸翻轉180度
    CGContextScaleCTM(context, 1.0, -1.0);
    CTFrameDraw(frame, context);
    CGPathRelease(path);
    CFRelease(framesetter);
}

- (void)drawRect: (CGRect)rect {
    [self characterAttribute];
}

1.5 用Quartz繪制文本

用Quartz繪制文本需要經過以下步驟:

1、設置字體及字體大小
2、設置繪制模式
3、設置其他——描邊色、填充色、背景區域
4、如果需要變換,需要設置文本矩陣、旋轉、縮放值
5、繪制

CORETEXT框架圖

另對于Context的了解可以參考: http:// www.padovo.com/blog/2013/01/31/study-coretext/

1.5.1 設置字體及字體大小

Quartz 2D有兩種方法設置字體及大小:CGContextSelectFont 或 CGContextSetFont+CGContextSetFontSize。

CGContextSelectFont更簡單一些。CGContextSetFont和CGContectSetFontSize麻煩一些,但你也可能想用Cocoa來設置字體然后進行繪制。因為Quartz在繪制文本上有一些限制。讓我們再來比較一下兩種方法的區別。

如果對你的應用而言,使用MacRoman文本編碼已經足夠的話,可以使用CGContextSelectFont函數。在繪制文本時,調用CGContextShowTextAtPoint函數。CGContextSelectFont函數有4個參數:一個圖形上下文,字體的PostScript字體名,字體大小(用戶空間單位),以及文本的編碼。

如果想使用MacRoman以外的文本編碼,應該使用CGContextSetFont和CGContextSetFontSize。必須為CGContextSetFont函數提供CGFont類型參數。調用CGFontCreateWithPlatformFont函數可以從ATS字體獲得一個CGFont對象。繪制文本時,調用CGContextShowGlyphsAtPoint替代CGContextShowTextAtPoint。

原因就在于,在將文本字節映射為字體符號時,需要指定一個文本編碼,默認的文本編碼是kCGEncodingFontSpecific,當你調用CGContextShowTextAtPoint時,不能保證一定會獲得一個文本編碼。由于你調用CGContextSetFont而不是CGContextSelectFont來指定字體,在CGContextSetFont中你并沒有指定文本編碼,你也就不能使用CGContextShowTextAtPoint來繪制文本。

如果你要用這種方式設置字體,你必須用Cocoa或者自己實現將字符串映射為符號,這樣你才能調用CGContextShowGlphsAtPoint。使用Cocoa繪制文本更簡單,根本不需要任何Quartz2D函數。現在,你明白了使用Quartz繪制文本的一些限制,我們來看看使用CGContextSelectFont函數的一些例子。CGContextSelectFont函數的使用十分簡單,但不建議你在MacRoman以外的編碼下使用。清單16-1 顯示了MyDrawText函數——用于繪制文本,如圖16-1所示。代碼后有詳細的解釋。


[NSAttributedString詳解](http:// www.cnblogs.com/zhw511006/archive/2012/09/21/2696700.html)

[IOS CoreText.framework ---基本用法](http:// blog.csdn.net/fengsh998/article/details/8691823)

[IOS CoreText.framework ---行CTLineRef](http:// blog.csdn.net/fengsh998/article/details/8701738)

[IOS CoreText.framework ---段落樣子CTParagraphStyle](http:// blog.csdn.net/fengsh998/article/details/8700627)

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。