最近項目中用到了圖文混排,所以就研究了一下iOS中的富文本,打算把研究的結果分享一下,也是對自己學習的一個總結。
在iOS中或者Mac OS X中怎樣才能將一個字符串繪制到屏幕上呢?
簡單來說,是通過控件來完成的,而這些控件都封裝在UIKit框架中(對于Mac OS X是AppKit框架),在UIKit中常用來在屏幕上顯示字符串的控件有3個:
UILabelUITextFieldUITextView
?
然而這些控件本身對文本的展現方式很單一,通常僅僅能夠控制字體樣式、大小、顏色、加粗、斜體等等,而對于行距控制,字距控制,段落控制等高級功能卻無能為力。
此時不免要提起一個非常強大的文本排版框架CoreText.framework。
CoreText框架是基于 iOS 3.2+ 和 OSX 10.5+ 的一種能夠對文本格式和文本布局進行精細控制的文本引擎。它良好的結合了 UIKit 和 Core Graphics/Quartz:
UIKit 的 UILabel 允許你通過在 IB 中簡單的拖曳添加文本,但你不能改變文本的顏色和其中的單詞。Core Graphics/Quartz幾乎允許你做任何系統允許的事情,但你需要為每個字形計算位置,并畫在屏幕上。
?
CoreText正結合了這兩者!你自己可以完全控制位置、布局、類似文本大小和顏色這樣的屬性,CoreText將幫你完善其它的東西——類似文本換行、字體呈現等等。
然而,CoreText.framework本身非常龐大,學習成本較高,使用起來也不是很方便,所以一般不是特殊需要,很少會有人去使用它。
隨著iOS6 API的發布,文字顯示的API越來越完善,其中一個重要的更新是在UITextField,UITextView和UILabel中加入了對AttributedString的支持,實現行距控制,字距控制,段落控制等高級功能也不必再去使用深奧的CoreText框架。
而iOS7的發布,蘋果又引入了TextKit,TextKit是一個快速而又現代化的文字排版和渲染引擎。
TextKit并沒有新增類,只是在原有的文本顯示控件上進行了封裝,可以在平時我們最喜歡使用的UILabel,UITextField,UITextView等控件里面使用,其最主要的作用就是為程序提供文字排版和渲染的功能。
蘋果引入TextKit的目的并非要取代已有的CoreText框架,雖然CoreText的主要作用也是用于文字的排版和渲染,但它是一種先進而又處于底層技術,如果我們需要將文本內容直接渲染到圖形上下文(Graphics context)時,從性能和易用性來考慮,最佳方案就是使用CoreText。而如果我們需要直接利用蘋果提供的一些控件(如UITextView、UILabel和UITextField等)對文字進行排版,那么借助于UIKit中TextKit提供的API無疑更為方便快捷。
TextKit在文字處理方面具有非常強大的功能,并且開發者可以對TextKit進行定制和擴展。據悉,蘋果利用了2年的時間來開發TextKit,相信這對許多開發者來說都是福音。
然而,無論CoreText還是TextKit都不在本文討論的范疇,因為它們都是非常龐大的體系,而我們的需求通過一個簡單小巧的AttributedString就可以輕松搞定,所以本文的關注點只有一個,那就是AttributedString,至于CoreText和TextKit,在真正需要的時候再進行深入研究和總結。
OK,啰嗦完畢,進入正題。
與NSString類似,在iOS中AttributedString也分為NSAttributedString和NSMutableAttributedString,不同的是,AttributedString對象多了一個Attribute的概念,一個AttributedString的對象包含很多的屬性,每一個屬性都有其對應的字符區域,在這里是使用NSRange來進行描述的。
使用AttributedString的方式通常有兩種:
方式一:
首先初始化一個NSMutableAttributedString,然后向里面添加文字樣式,最后將它賦給控件的AttributedText,該方法適合于文本較少而又需要分段精細控制的情況。
NSString *originStr = @"Hello,中秋節!";//方式一//創建 NSMutableAttributedString NSMutableAttributedString *attributedStr01 = [[NSMutableAttributedString alloc] initWithString: originStr];//添加屬性//給所有字符設置字體為Zapfino,字體高度為15像素 [attributedStr01 addAttribute: NSFontAttributeName value: [UIFont fontWithName: @"Zapfino" size: 15]range: NSMakeRange(0, originStr.length)]; //分段控制,最開始4個字符顏色設置成藍色 [attributedStr01 addAttribute: NSForegroundColorAttributeName value: [UIColor blueColor] range: NSMakeRange(0, 4)]; //分段控制,第5個字符開始的3個字符,即第5、6、7字符設置為紅色 [attributedStr01 addAttribute: NSForegroundColorAttributeName value: [UIColor redColor] range: NSMakeRange(4, 3)];//賦值給顯示控件label01的 attributedText _label01.attributedText = attributedStr01;
?
方式二:
首先創建屬性字典,初始化各種屬性,然后和需要控制的文本一起創建并賦值給控件的AttributedText,該方法適合于需要控制的文本較多整體控制的情況,通常是從文件中讀取的大段文本控制。
//方式二//創建屬性字典 NSDictionary *attrDict = @{ NSFontAttributeName: [UIFont fontWithName: @"Zapfino" size: 15],NSForegroundColorAttributeName: [UIColor blueColor] };//創建 NSAttributedString 并賦值 _label02.attributedText = [[NSAttributedString alloc] initWithString: originStr attributes: attrDict];通過對比兩個例子可以看出,方式一比較容易處理復雜的格式,但是屬性設置比較繁多復雜,而方式二的屬性設置比較簡單明了,卻不善于處理復雜多樣的格式控制,但是不善于并不等于不能,可以通過屬性字符串分段的方式來達到方式一的效果,如下://方式二的分段處理 //第一段 NSDictionary *attrDict1 = @{ NSFontAttributeName: [UIFont fontWithName: @"Zapfino" size: 15],NSForegroundColorAttributeName: [UIColor blueColor] }; NSAttributedString *attrStr1 = [[NSAttributedString alloc] initWithString: [originStr substringWithRange: NSMakeRange(0, 4)] attributes: attrDict1];//第二段 NSDictionary *attrDict2 = @{ NSFontAttributeName: [UIFont fontWithName: @"Zapfino" size: 15],NSForegroundColorAttributeName: [UIColor redColor] }; NSAttributedString *attrStr2 = [[NSAttributedString alloc] initWithString: [originStr substringWithRange: NSMakeRange(4, 3)] attributes: attrDict2];//第三段 NSDictionary *attrDict3 = @{ NSFontAttributeName: [UIFont fontWithName: @"Zapfino" size: 15],NSForegroundColorAttributeName: [UIColor blackColor] }; NSAttributedString *attrStr3 = [[NSAttributedString alloc] initWithString: [originStr substringWithRange:NSMakeRange(7, originStr.length - 4 - 3)] attributes: attrDict3]; //合并 NSMutableAttributedString *attributedStr03 = [[NSMutableAttributedString alloc] initWithAttributedString: attrStr1]; [attributedStr03 appendAttributedString: attrStr2]; [attributedStr03 appendAttributedString: attrStr3];_label03.attributedText = attributedStr03;
?
好了,講完AttributedString的創建方式,下面研究下AttributedString究竟可以設置哪些屬性,具體來說,有以下21個:
// 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 對象
?
下面就一一舉例說明:
1. NSFontAttributeName
//NSForegroundColorAttributeName 設置字體顏色,取值為 UIColor,默認為黑色 NSDictionary *attrDict1 = @{ NSForegroundColorAttributeName: [UIColor redColor] }; NSDictionary *attrDict2 = @{ NSForegroundColorAttributeName: [UIColor blueColor] }; NSDictionary *attrDict3 = @{ NSForegroundColorAttributeName: [UIColor orangeColor] };_label01.attributedText = [[NSAttributedString alloc] initWithString: originStr attributes: attrDict1]; _label02.attributedText = [[NSAttributedString alloc] initWithString: originStr attributes: attrDict2]; _label03.attributedText = [[NSAttributedString alloc] initWithString: originStr attributes: attrDict3];注意:NSForegroundColorAttributeName設置的顏色與UILabel的textColor屬性設置的顏色在地位上是相等的,誰最后賦值,最終顯示的就是誰的顏色。
?
2. NSBackgroundColorAttributeName
//NSForegroundColorAttributeName 設置字體顏色,取值為 UIColor,默認為黑色 NSDictionary *attrDict1 = @{ NSForegroundColorAttributeName: [UIColor redColor] }; NSDictionary *attrDict2 = @{ NSForegroundColorAttributeName: [UIColor blueColor] }; NSDictionary *attrDict3 = @{ NSForegroundColorAttributeName: [UIColor orangeColor] };_label01.attributedText = [[NSAttributedString alloc] initWithString: originStr attributes: attrDict1]; _label02.attributedText = [[NSAttributedString alloc] initWithString: originStr attributes: attrDict2]; _label03.attributedText = [[NSAttributedString alloc] initWithString: originStr attributes: attrDict3];//NSBackgroundColorAttributeName 設置字體所在區域背景的顏色,取值為UIColor,默認值為nil NSDictionary *attrDict4 = @{ NSBackgroundColorAttributeName: [UIColor orangeColor] }; NSDictionary *attrDict5 = @{ NSBackgroundColorAttributeName: [UIColor redColor] }; NSDictionary *attrDict6 = @{ NSBackgroundColorAttributeName: [UIColor cyanColor] };_label01.attributedText = [[NSAttributedString alloc] initWithString: originStr attributes: attrDict4]; _label02.attributedText = [[NSAttributedString alloc] initWithString: originStr attributes: attrDict5]; _label03.attributedText = [[NSAttributedString alloc] initWithString: originStr attributes: attrDict6];仔細觀察會發現個問題,我并沒有關閉 NSForegroundColorAttributeName 屬性,但是在運行結果中,所有字體的顏色都變成了默認色——黑色,這說明 NSForegroundColorAttributeName 和 NSBackgroundColorAttributeName 的低位是相等的,跟前面介紹的 textColor 一樣,哪個屬性最后一次賦值,就會沖掉前面的效果,若是我們把屬性代碼順序交換一下//NSBackgroundColorAttributeName 設置字體所在區域背景的顏色,取值為UIColor,默認值為nil NSDictionary *attrDict4 = @{ NSBackgroundColorAttributeName: [UIColor orangeColor] }; NSDictionary *attrDict5 = @{ NSBackgroundColorAttributeName: [UIColor redColor] }; NSDictionary *attrDict6 = @{ NSBackgroundColorAttributeName: [UIColor cyanColor] };_label01.attributedText = [[NSAttributedString alloc] initWithString: originStr attributes: attrDict4]; _label02.attributedText = [[NSAttributedString alloc] initWithString: originStr attributes: attrDict5]; _label03.attributedText = [[NSAttributedString alloc] initWithString: originStr attributes: attrDict6];//NSForegroundColorAttributeName 設置字體顏色,取值為 UIColor,默認為黑色 NSDictionary *attrDict1 = @{ NSForegroundColorAttributeName: [UIColor redColor] }; NSDictionary *attrDict2 = @{ NSForegroundColorAttributeName: [UIColor blueColor] }; NSDictionary *attrDict3 = @{ NSForegroundColorAttributeName: [UIColor orangeColor] };_label01.attributedText = [[NSAttributedString alloc] initWithString: originStr attributes: attrDict1]; _label02.attributedText = [[NSAttributedString alloc] initWithString: originStr attributes: attrDict2]; _label03.attributedText = [[NSAttributedString alloc] initWithString: originStr attributes: attrDict3];但是textColor屬性可以與 NSBackgroundColorAttributeName 屬性疊加_label01.textColor = [UIColor greenColor]; _label02.textColor = [UIColor yellowColor]; _label03.textColor = [UIColor blueColor];//NSForegroundColorAttributeName 設置字體顏色,取值為 UIColor,默認為黑色 NSDictionary *attrDict1 = @{ NSForegroundColorAttributeName: [UIColor redColor] }; NSDictionary *attrDict2 = @{ NSForegroundColorAttributeName: [UIColor blueColor] }; NSDictionary *attrDict3 = @{ NSForegroundColorAttributeName: [UIColor orangeColor] };_label01.attributedText = [[NSAttributedString alloc] initWithString: originStr attributes: attrDict1]; _label02.attributedText = [[NSAttributedString alloc] initWithString: originStr attributes: attrDict2]; _label03.attributedText = [[NSAttributedString alloc] initWithString: originStr attributes: attrDict3];//NSBackgroundColorAttributeName 設置字體所在區域背景的顏色,取值為UIColor,默認值為nil NSDictionary *attrDict4 = @{ NSBackgroundColorAttributeName: [UIColor orangeColor] }; NSDictionary *attrDict5 = @{ NSBackgroundColorAttributeName: [UIColor redColor] }; NSDictionary *attrDict6 = @{ NSBackgroundColorAttributeName: [UIColor cyanColor] };_label01.attributedText = [[NSAttributedString alloc] initWithString: originStr attributes: attrDict4]; _label02.attributedText = [[NSAttributedString alloc] initWithString: originStr attributes: attrDict5]; _label03.attributedText = [[NSAttributedString alloc] initWithString: originStr attributes: attrDict6];雖然 textColor 在 NSFontAttributeName 之前賦值,但是由于 NSFontAttributeName 的屬性效果被NSBackgroundColorAttributeName 屬性沖掉了,所以最終顯示了 textColor 的顏色。
?
3. NSLigatureAttributeName
//NSLigatureAttributeName 設置連體屬性,取值為NSNumber 對象(整數),0 表示沒有連體字符,1 表示使用默認的連體字符, // 2 表示使用所有連體符號,默認值為 1(iOS 不支持 2) NSString *ligatureStr = @"flush";NSDictionary *attrDict1 = @{ NSLigatureAttributeName: [NSNumber numberWithInt: 0],NSFontAttributeName: [UIFont fontWithName: @"futura" size: 30] }; _label01.attributedText = [[NSAttributedString alloc] initWithString: ligatureStr attributes: attrDict1];NSDictionary *attrDict2 = @{ NSLigatureAttributeName: @(1),NSFontAttributeName: [UIFont fontWithName: @"futura" size: 30] }; _label02.attributedText = [[NSAttributedString alloc] initWithString: ligatureStr attributes: attrDict2];由于要展示連體字符,所以將前面使用的帶有中文的字符串換成 flushNSLigatureAttributeName的取值為NSNumber對象,所以不能直接將一個整數值賦給它,創建 NSNumber 對象的方法有很多,或者可以簡寫成 @(int)注意觀察字母f和l之間的變化。感覺連寫就是一個藝術字功能,當字符f和l組合使用組合符號(所謂的字形(glyph))繪制時,看起來確實更加美觀。但是并非所有的字符之間都有組合符號,事實上,只有某些字體中得某些字符的組合(如字符f和l,字符f和i等)才具有美觀的組合符號。
?
4. NSKernAttributeName
//NSKernAttributeName 設定字符間距,取值為 NSNumber 對象(整數),正值間距加寬,負值間距變窄 NSDictionary *attrDict1 = @{ NSKernAttributeName: @(-3),NSFontAttributeName: [UIFont systemFontOfSize: 20]};_label01.attributedText = [[NSAttributedString alloc] initWithString: originStr attributes: attrDict1];NSDictionary *attrDict2 = @{ NSKernAttributeName: @(0),NSFontAttributeName: [UIFont systemFontOfSize: 20]};_label02.attributedText = [[NSAttributedString alloc] initWithString: originStr attributes: attrDict2];NSDictionary *attrDict3 = @{ NSKernAttributeName: @(10),NSFontAttributeName: [UIFont systemFontOfSize: 20]};_label03.attributedText = [[NSAttributedString alloc] initWithString: originStr attributes: attrDict3];
?
5. NSStrikethroughStyleAttributeName
//NSStrikethroughStyleAttributeName 設置刪除線,取值為 NSNumber 對象(整數),枚舉常量 NSUnderlineStyle中的值 // NSUnderlineStyleNone 不設置刪除線 // NSUnderlineStyleSingle 設置刪除線為細單實線 // NSUnderlineStyleThick 設置刪除線為粗單實線 // NSUnderlineStyleDouble 設置刪除線為細雙實線 NSDictionary *attrDict1 = @{ NSStrikethroughStyleAttributeName: @(NSUnderlineStyleSingle),NSFontAttributeName: [UIFont systemFontOfSize:20] }; _label01.attributedText = [[NSAttributedString alloc] initWithString: originStr attributes: attrDict1];NSDictionary *attrDict2 = @{ NSStrikethroughStyleAttributeName: @(NSUnderlineStyleThick),NSFontAttributeName: [UIFont systemFontOfSize:20] }; _label02.attributedText = [[NSAttributedString alloc] initWithString: originStr attributes: attrDict2];NSDictionary *attrDict3 = @{ NSStrikethroughStyleAttributeName: @(NSUnderlineStyleDouble),NSFontAttributeName: [UIFont systemFontOfSize:20] }; _label03.attributedText = [[NSAttributedString alloc] initWithString: originStr attributes: attrDict3]; 注意:雖然使用了枚舉常量,但是枚舉常量的本質仍為整數,所以同樣必須先轉化為 NSNumber 才能使用刪除線和下劃線使用相同的枚舉常量作為其屬性值目前iOS中只有上面列出的4中效果,雖然我們能夠在頭文件中發現其他更多的取值,但是使用后沒有任何效果可以看出,中文和英文刪除線的位置有所不同另外,刪除線屬性取值除了上面的4種外,其實還可以取其他整數值,有興趣的可以自行試驗,取值為 0 - 7時,效果為單實線,隨著值得增加,單實線逐漸變粗,取值為 9 - 15時,效果為雙實線,取值越大,雙實線越粗。NSDictionary *attrDict1 = @{ NSStrikethroughStyleAttributeName: @(1),NSFontAttributeName: [UIFont systemFontOfSize:20] }; _label01.attributedText = [[NSAttributedString alloc] initWithString: originStr attributes: attrDict1];NSDictionary *attrDict2 = @{ NSStrikethroughStyleAttributeName: @(3),NSFontAttributeName: [UIFont systemFontOfSize:20] }; _label02.attributedText = [[NSAttributedString alloc] initWithString: originStr attributes: attrDict2];NSDictionary *attrDict3 = @{ NSStrikethroughStyleAttributeName: @(7),NSFontAttributeName: [UIFont systemFontOfSize:20] }; _label03.attributedText = [[NSAttributedString alloc] initWithString: originStr attributes: attrDict3];
?
6. NSStrikethroughColorAttributeName
//NSStrikethroughColorAttributeName 設置刪除線顏色,取值為 UIColor 對象,默認值為黑色 NSDictionary *attrDict1 = @{ NSStrikethroughColorAttributeName: [UIColor blueColor],NSStrikethroughStyleAttributeName: @(1),NSFontAttributeName: [UIFont systemFontOfSize:20] };_label01.attributedText = [[NSAttributedString alloc] initWithString: originStr attributes: attrDict1];NSDictionary *attrDict2 = @{ NSStrikethroughColorAttributeName: [UIColor orangeColor],NSStrikethroughStyleAttributeName: @(3),NSFontAttributeName: [UIFont systemFontOfSize:20] };_label02.attributedText = [[NSAttributedString alloc] initWithString: originStr attributes: attrDict2];NSDictionary *attrDict3 = @{ NSStrikethroughColorAttributeName: [UIColor greenColor],NSStrikethroughStyleAttributeName: @(7),NSFontAttributeName: [UIFont systemFontOfSize:20] };_label03.attributedText = [[NSAttributedString alloc] initWithString: originStr attributes: attrDict3];
?
7. NSUnderlineStyleAttributeName
下劃線除了線條位置和刪除線不同外,其他的都可以完全參照刪除線設置。//NSUnderlineStyleAttributeName 設置下劃線,取值為 NSNumber 對象(整數),枚舉常量 NSUnderlineStyle中的值,與刪除線類似 NSDictionary *attrDict1 = @{ NSUnderlineStyleAttributeName: @(NSUnderlineStyleSingle),NSFontAttributeName: [UIFont systemFontOfSize:20] }; _label01.attributedText = [[NSAttributedString alloc] initWithString: originStr attributes: attrDict1];NSDictionary *attrDict2 = @{ NSUnderlineStyleAttributeName: @(NSUnderlineStyleThick),NSFontAttributeName: [UIFont systemFontOfSize:20] }; _label02.attributedText = [[NSAttributedString alloc] initWithString: originStr attributes: attrDict2];NSDictionary *attrDict3 = @{ NSUnderlineStyleAttributeName: @(NSUnderlineStyleDouble),NSFontAttributeName: [UIFont systemFontOfSize:20] }; _label03.attributedText = [[NSAttributedString alloc] initWithString: originStr attributes: attrDict3];
?
8. NSUnderlineColorAttributeName
可以完全參照下劃線顏色設置//NSUnderlineColorAttributeName 設置下劃線顏色,取值為 UIColor 對象,默認值為黑色 NSDictionary *attrDict1 = @{ NSUnderlineColorAttributeName: [UIColor blueColor],NSUnderlineStyleAttributeName: @(NSUnderlineStyleSingle),NSFontAttributeName: [UIFont systemFontOfSize:20] };_label01.attributedText = [[NSAttributedString alloc] initWithString: originStr attributes: attrDict1];NSDictionary *attrDict2 = @{ NSUnderlineColorAttributeName: [UIColor orangeColor],NSUnderlineStyleAttributeName: @(NSUnderlineStyleThick),NSFontAttributeName: [UIFont systemFontOfSize:20] };_label02.attributedText = [[NSAttributedString alloc] initWithString: originStr attributes: attrDict2];NSDictionary *attrDict3 = @{ NSUnderlineColorAttributeName: [UIColor greenColor],NSUnderlineStyleAttributeName: @(NSUnderlineStyleDouble),NSFontAttributeName: [UIFont systemFontOfSize:20] };_label03.attributedText = [[NSAttributedString alloc] initWithString: originStr attributes: attrDict3];
?
9. NSStrokeWidthAttributeName
//NSStrokeWidthAttributeName 設置筆畫寬度,取值為 NSNumber 對象(整數),負值填充效果,正值中空效果 NSDictionary *attrDict1 = @{ NSStrokeWidthAttributeName: @(-3),NSFontAttributeName: [UIFont systemFontOfSize:30] };_label01.attributedText = [[NSAttributedString alloc] initWithString: originStr attributes: attrDict1];NSDictionary *attrDict2 = @{ NSStrokeWidthAttributeName: @(0),NSFontAttributeName: [UIFont systemFontOfSize:30] };_label02.attributedText = [[NSAttributedString alloc] initWithString: originStr attributes: attrDict2];NSDictionary *attrDict3 = @{ NSStrokeWidthAttributeName: @(3),NSFontAttributeName: [UIFont systemFontOfSize:30] };_label03.attributedText = [[NSAttributedString alloc] initWithString: originStr attributes: attrDict3];
?
10. NSStrokeColorAttributeName
//NSStrokeColorAttributeName 填充部分顏色,不是字體顏色,取值為 UIColor 對象 NSDictionary *attrDict1 = @{ NSStrokeWidthAttributeName: @(-3),NSStrokeColorAttributeName: [UIColor orangeColor],NSFontAttributeName: [UIFont systemFontOfSize:30] };_label01.attributedText = [[NSAttributedString alloc] initWithString: originStr attributes: attrDict1];NSDictionary *attrDict2 = @{ NSStrokeWidthAttributeName: @(0),NSStrokeColorAttributeName: [UIColor blueColor],NSFontAttributeName: [UIFont systemFontOfSize:30] };_label02.attributedText = [[NSAttributedString alloc] initWithString: originStr attributes: attrDict2];NSDictionary *attrDict3 = @{ NSStrokeWidthAttributeName: @(3),NSStrokeColorAttributeName: [UIColor greenColor],NSFontAttributeName: [UIFont systemFontOfSize:30] };_label03.attributedText = [[NSAttributedString alloc] initWithString: originStr attributes: attrDict3];
?