富文字簡單實用(一)
富文字(Normal)
改變某個字串中部分字元的顯示樣式
//NSFontAttributeName 設定字型屬性,預設值:字型:Helvetica(Neue) 字號:12
//NSForegroundColorAttributeNam 設定字型顏色,取值為 UIColor物件,預設值為黑色
//NSBackgroundColorAttributeName 設定字型所在區域背景顏色,取值為 UIColor物件,預設值為nil, 透明色
//NSLigatureAttributeName 設定連體屬性,取值為NSNumber 物件(整數),0 表示沒有連體字元,1 表示使用預設的連體字元
//NSKernAttributeName 設定字元間距,取值為 NSNumber物件(整數),正值間距加寬,負值間距變窄
//NSStrikethroughStyleAttributeName 設定刪除線,取值為 NSNumber 物件(整數)
//NSStrikethroughColorAttributeName 設定刪除線顏色,取值為 UIColor 物件,預設值為黑色
//NSUnderlineStyleAttributeName 設定下劃線,取值為 NSNumber 物件(整數),列舉常量NSUnderlineStyle中的值,與刪除線類似
//NSUnderlineColorAttributeName 設定下劃線顏色,取值為 UIColor 物件,預設值為黑色
//NSStrokeWidthAttributeName 設定筆畫寬度,取值為 NSNumber
物件(整數),負值填充效果,正值中空效果//NSStrokeColorAttributeName 填充部分顏色,不是字型顏色,取值為 UIColor 物件
//NSShadowAttributeName 設定陰影屬性,取值為 NSShadow 物件
//NSTextEffectAttributeName 設定文字特殊效果,取值為 NSString
物件,目前只有圖版印刷效果可用://NSBaselineOffsetAttributeName 設定基線偏移值,取值為 NSNumber(float),正值上偏,負值下偏
//NSObliquenessAttributeName 設定字形傾斜度,取值為 NSNumber(float),正值右傾,負值左傾
//NSExpansionAttributeName 設定文字橫向拉伸屬性,取值為 NSNumber(float),正值橫向拉伸文字,負值橫向壓縮文字
//NSWritingDirectionAttributeName 設定文字書寫方向,從左向右書寫或者從右向左書寫
//NSVerticalGlyphFormAttributeName 設定文字排版方向,取值為 NSNumber 物件(整數),0 表示橫排文字,1 表示豎排文字
//NSLinkAttributeName 設定連結屬性,點選後呼叫瀏覽器開啟指定URL地址
//NSAttachmentAttributeName 設定文字附件,取值為NSTextAttachment物件,常用於文字圖片混排
//NSParagraphStyleAttributeName 設定文字段落排版格式,取值為 NSParagraphStyle 物件
NSMutableAttributedString *text = [[NSMutableAttributedString alloc]initWithString:@"《坦克世界》南北大區將於北京時間2016年04月01日09:45開放新模式“進擊月球”,屆時請您進入遊戲體驗。"];
[text beginEditing];
//改變字型大小
//NSFontAttributeName:這個屬性的值是一個UIFont物件。使用這個屬性來更改字型的文字
[text addAttribute:NSFontAttributeName value:[UIFont systemFontOfSize:30] range:NSMakeRange(1,4)];
//字型的設定
[text addAttribute:NSFontAttributeName value:[UIFont fontWithName:@"Optima" size:35] range:NSMakeRange(37, 6)];
// NSLog(@"%@",[UIFont familyNames]);
//字型顏色
//NSForegroundColorAttributeName:這個屬性的值是一個使用者介面顏色物件。使用這個屬性來指定文字中呈現的顏色。如果你不指定該屬性,文字呈現黑色。
[text addAttribute:NSForegroundColorAttributeName value:[UIColor redColor] range:NSMakeRange(37, 6)];
//下劃線
//NSUnderlineStyleAttributeName:描述文字中的下劃線屬性。預設是NSUnderlineStyleNone。
[text addAttribute:NSUnderlineStyleAttributeName value:@(NSUnderlineStyleThick) range:NSMakeRange(16, 16)];
//下劃線顏色(依附於下劃線)
[text addAttribute:NSUnderlineColorAttributeName value:[UIColor blueColor] range:NSMakeRange(16, 16)];
//刪除線
//NSStrikethroughStyleAttributeName:描述文字中的下劃線屬性。預設是NSUnderlineStyleNone。
[text addAttribute:NSStrikethroughStyleAttributeName value:@( NSUnderlineStyleSingle) range:NSMakeRange(1, 4)];
//刪除線顏色(依附於刪除線)
[text addAttribute:NSStrikethroughColorAttributeName value:[UIColor cyanColor] range:NSMakeRange(1, 4)];
//新增背景色
[text addAttribute:NSBackgroundColorAttributeName value:[UIColor lightGrayColor] range:NSMakeRange(1, 4)];
//填充字
[text addAttribute:NSStrokeWidthAttributeName value:@(-1) range:NSMakeRange(16, 16)];
//空心字
[text addAttribute:NSStrokeWidthAttributeName value:@(1) range:NSMakeRange(6, 4)];
//改變填充字/空心字顏色(依附於填充字/空心字)
[text addAttribute:NSStrokeColorAttributeName value:[UIColor greenColor] range:NSMakeRange(6, 4)];
// 新增圖片
/**
步驟如下:
建立NSTextAttachment的物件,用來裝在圖片
將NSTextAttachment物件的image屬性設定為想要使用的圖片
設定NSTextAttachment物件bounds大小,也就是要顯示的圖片的大小
用[NSAttributedString attributedStringWithAttachment:attch]方法,將圖片新增到富文字上
*/
// 新增圖片
NSTextAttachment *attch = [[NSTextAttachment alloc] init];
// 表情圖片
attch.image = [UIImage imageNamed:@"tank"];
// 設定圖片大小
attch.bounds = CGRectMake(0, 0, 50, 50);
// 建立帶有圖片的富文字
NSAttributedString *string = [NSAttributedString attributedStringWithAttachment:attch];
[text appendAttributedString:string];
[text endEditing];
self.label.attributedText = text;
富文字(CoreText)
首先記得
#import <CoreText/CoreText.h
在drawRect:中實現
- (void)drawRect:(CGRect)rect{
[super drawRect:rect];
[self coreText];
}
CoreText 框架中最常用的幾個類:
CTFont
CTFontCollection
CTFontDescriptor
CTFrame
CTFramesetter
CTGlyphInfo
CTLine
CTParagraphStyle
CTRun
CTTextTab
CTTypesetter
//kCTFontAttributeName 這個鍵是字型的名稱 必須傳入CTFont物件
//kCTKernAttributeName 這個鍵設定字型間距 傳入必須是數字物件 預設為0
//kCTLigatureAttributeName 這個鍵設定連字方式 必須傳入CFNumber物件
//kCTParagraphStyleAttributeName 段落對其方式
//kCTForegroundColorAttributeName 字型顏色 必須傳入CGColor物件
//kCTStrokeWidthAttributeName 筆畫寬度 必須是CFNumber物件
//kCTStrokeColorAttributeName 筆畫顏色
//kCTSuperscriptAttributeName 控制垂直文字定位 CFNumber物件
//kCTUnderlineColorAttributeName 下劃線顏色
第一步:新增屬性
NSMutableAttributedString *text = [[NSMutableAttributedString alloc]initWithString:@"《坦克世界》南北大區將於北京時間2016年04月01日09:45開放新模式“進擊月球”,屆時請您進入遊戲體驗。"];
//開始編輯
[text beginEditing];
//設定字型屬性
//引數1.字型的名字 引數2.字型的大小 引數3.字型的變換矩陣。在大多數情況下,將該引數設定為NULL。
CTFontRef font = CTFontCreateWithName(CFSTR("Optima-Regular"), 25, NULL);
[text addAttribute:(id)kCTFontAttributeName value:(__bridge id _Nonnull)(font) range:NSMakeRange(0, text.length)];
//設定字型間隔
long number = 10;
//引數1.allocator:通過NULL或kCFAllocatorDefault使用預設的分配器。
//引數2.theType:通過CFNumber用來顯示一個值的資料型別
CFNumberRef num = CFNumberCreate(kCFAllocatorDefault, kCFNumberSInt8Type, &number);
//kCTKernAttributeName:字距調整
[text addAttribute:(id)kCTKernAttributeName value:(__bridge id)num range:NSMakeRange(37, 6)];
//設定字型顏色
//kCTForegroundColorAttributeName:文字的前景顏色。該屬性的值必須是一個CGColor物件。預設值是黑色
[text addAttribute:(NSString *)kCTForegroundColorAttributeName value:(id)[UIColor purpleColor].CGColor range:NSMakeRange(0, text.length)];
//設定空心字
long number2 = 3;
CFNumberRef num2 = CFNumberCreate(kCFAllocatorDefault, kCFNumberSInt8Type, &number2);
[text addAttribute:(id)kCTStrokeWidthAttributeName value:(__bridge id) num2 range:NSMakeRange(0, text.length)];
//設定空心字顏色
[text addAttribute:(id)kCTStrokeColorAttributeName value:(id)[UIColor redColor].CGColor range:NSMakeRange(16, 16)];
//設定斜體字
CTFontRef font2 = CTFontCreateWithName((CFStringRef)[UIFont italicSystemFontOfSize:25].fontName, 25, NULL);
[text addAttribute:(id)kCTFontAttributeName value:(__bridge id _Nonnull)(font2) range:NSMakeRange(16, 16)];
//下劃線
[text addAttribute:(id)kCTUnderlineStyleAttributeName value:(id)[NSNumber numberWithInt:kCTUnderlineStyleDouble] range:NSMakeRange(16, 16)];
//下劃線顏色
[text addAttribute:(id)kCTUnderlineColorAttributeName value:(id)[UIColor greenColor].CGColor range:NSMakeRange(16, 16)];
//對同一段字型進行多屬性設定
//黑色
NSMutableDictionary *attributes = [NSMutableDictionary dictionaryWithObject:(id)[UIColor blackColor].CGColor forKey:(id)kCTForegroundColorAttributeName];
//字型
CTFontRef font3 = CTFontCreateWithName((CFStringRef)[UIFont italicSystemFontOfSize:20].fontName, 40, NULL);
[attributes setObject:(__bridge id)font3 forKey:(id)kCTFontAttributeName];
//下劃線
[attributes setObject:(id)[NSNumber numberWithInt:kCTUnderlineStyleDouble] forKey:(id)kCTUnderlineStyleAttributeName];
[text addAttributes:attributes range:NSMakeRange(1, 4)];
//結束編輯
[text endEditing];
第二步:繪圖、渲染
//設定繪製文字區域
CGMutablePathRef Path = CGPathCreateMutable();
CGPathAddRect(Path, NULL ,self.bounds);
CTFramesetterRef framesetter = CTFramesetterCreateWithAttributedString((CFAttributedStringRef)text);
CTFrameRef frame = CTFramesetterCreateFrame(framesetter, CFRangeMake(0, text.length), Path, NULL);
//獲取當前(View)上下文以用於之後的繪畫
CGContextRef context = UIGraphicsGetCurrentContext();
// Flip the coordinate system
CGContextSetTextMatrix(context , CGAffineTransformIdentity);
//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);