API接口文檔。
https://developer.apple.com/library/mac/#documentation/Carbon/Reference/CoreText_Framework_Ref/_index.html
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 添加CoreText.framework
2 自定義類
- (void)drawRect:(CGRect)rect
{
NSString *text = self.mutableText;
NSMutableAttributedString *mabstring = [[NSMutableAttributedString alloc]initWithString:text];
//設定字型屬性
CTFontRef font = CTFontCreateWithName(CFSTR("Georgia"), 40,NULL);
[mabstring addAttribute:(id)kCTFontAttributeName value:(__bridge id)font range:NSMakeRange(0,4)];
//設定斜體
CTFontRef font2 = CTFontCreateWithName((CFStringRef)[UIFont italicSystemFontOfSize:18].fontName, 14, NULL);
[mabstring addAttribute:(id)kCTFontAttributeName value:(__bridge id)font2 range:NSMakeRange(5, 6)];
//設定下劃線
[mabstring addAttribute:(id)kCTUnderlineStyleAttributeName value:(id)[NSNumber numberWithInt:kCTUnderlineStyleThick] range:NSMakeRange(11, 5)];
//設定下劃線顔色
[mabstring addAttribute:(id)kCTUnderlineColorAttributeName value:(id)[UIColor redColor].CGColor range:NSMakeRange(11, 5)];
//設定字型簡隔
long num = 15;
CFNumberRef num1 = CFNumberCreate(kCFAllocatorDefault, kCFNumberSInt8Type,&num);
[mabstring addAttribute:(id)kCTKernAttributeName value:(__bridge id)num1 range:NSMakeRange(20, 4)];
//設定空心字
long num2 = 2;
CFNumberRef num3 = CFNumberCreate(kCFAllocatorDefault, kCFNumberSInt8Type, &num2);
[mabstring addAttribute:(id)kCTStrokeWidthAttributeName value:(__bridge id)num3 range:NSMakeRange(25, 4)];
[mabstring addAttribute:(id)kCTStrokeColorAttributeName value:(id)[UIColor blueColor].CGColor range:NSMakeRange(25, 4)];
//多屬性設定
NSMutableDictionary *attributes = [NSMutableDictionary dictionaryWithObject:(id)[UIColor redColor] forKey:(id)kCTForegroundColorAttributeName];
CTFontRef font3 = CTFontCreateWithName((CFStringRef)[UIFont italicSystemFontOfSize:25].fontName, 19,NULL);
[attributes setObject:(__bridge id)font3 forKey:(id)kCTFontAttributeName];
[attributes setObject:(id)[NSNumber numberWithInt:kCTUnderlineStyleDouble] forKey:(id)kCTUnderlineStyleAttributeName];
[mabstring addAttributes:attributes range:NSMakeRange(mabstring.length-6, 5)];
//url 設定字型和顔色
//判斷是否是url的正規表達式
NSString *regulaStr = @"((http[s]{0,1}|ftp)://[a-zA-Z0-9\\.\\-]+\\.([a-zA-Z]{2,4})(:\\d+)?(/[a-zA-Z0-9\\.\\[email protected]#$%^&*+?:_/=<>]*)?)|(www.[a-zA-Z0-9\\.\\-]+\\.([a-zA-Z]{2,4})(:\\d+)?(/[a-zA-Z0-9\\.\\[email protected]#$%^&*+?:_/=<>]*)?)";
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:regulaStr options:NSRegularExpressionCaseInsensitive error:nil];
//text中符合正規表達式的結果
NSArray * arrayOfAllMatches = [regex matchesInString:text options:0 range:NSMakeRange(0, [text length])];
//設定字型, __bridge 關鍵字來實作id類型與void*類型的互相轉換
CTFontRef fontRef = CTFontCreateWithName((__bridge CFStringRef)[NSString stringWithFormat:@"Arial"], 17, NULL);
//開始設定字型及顯示字型的顔色
[arrayOfAllMatches enumerateObjectsUsingBlock:^(NSTextCheckingResult * obj, NSUInteger idx, BOOL *stop) {
[mabstring addAttribute:(NSString *)kCTFontAttributeName value:(__bridge id)fontRef range:obj.range];
[mabstring addAttribute:(NSString *)kCTForegroundColorAttributeName value:(__bridge id)[UIColor blueColor].CGColor range:obj.range];
}];
CGContextRef cgc = UIGraphicsGetCurrentContext();
CGContextSaveGState(cgc);
//圖像方向轉換,在iOS的2D繪圖中采用的就是我們熟知的直角坐标系,即原點在左下方,右上為正軸,這裡要注意的是和我們在視圖(UIView)中布局的坐标系是不一樣的,他的圓點在左上,右下為正軸。當我們在視圖的drawRect中工作的時候拿到的畫闆已經是左上坐标的了,那這時候你要去把一個有自己坐标體系的内容直接繪制,就會出現坐标不一緻問題,例如直接繪制圖檔就會倒立
CGContextConcatCTM(cgc, CGAffineTransformScale(CGAffineTransformMakeTranslation(0, self.bounds.size.height), 1.f, -1.f));
//讀取NSMutableAttributedString
CTFramesetterRef framesetter = CTFramesetterCreateWithAttributedString((__bridge CFAttributedStringRef)mabstring);
CGRect drawingRect = self.bounds;
// 建立一個Path句柄
CGMutablePathRef path = CGPathCreateMutable();
//在此句柄的基礎上 畫出此矩形
CGPathAddRect(path, NULL, drawingRect);
//擷取所畫text的frame
CTFrameRef textFrame = CTFramesetterCreateFrame(framesetter,CFRangeMake(0,0), path, NULL);
CGPathRelease(path);
CFRelease(framesetter);
//draw begin
CTFrameDraw(textFrame, cgc);
CGContextRestoreGState(cgc);
}