API接口文檔
1 CoreText.framework簡介
1.1 常用類庫
CoreText 框架中最常用的幾個類:
1 CTFont
4 CTFrame
7 CTLine
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)