之前做項目時遇到一個問題:
使用UITextView顯示一段電影的簡介,由於字數比較多,所以字體設置的很小,行間距和段間距也很小,一大段文字擠在一起看起來很別扭,想要把行間距調大,結果在XCode中查遍其所有屬性才發現,UITextView居然沒有調整行間距的接口,於是忍住不心裡抱怨了一下下。 但是問題還是要解決的,上網一查才發現,iOS不僅有富文本處理的功能,而且對於文字排版的處理能力那是相當的強大,看來我是孤陋寡聞了。 正題開始之前插播一點基礎知識: 在iOS中或者Mac OS X中怎樣才能將一個字符串繪制到屏幕上呢? 簡單來說,是通過控件來完成的,而這些控件都封裝在UIKit框架中(對於Mac OS X是AppKit框架),在UIKit中常用來在屏幕上顯示字符串的控件有3個: UILabel UITextField UITextView 然而這些控件本身對文本的展現方式很單一,通常僅僅能夠控制字體樣式、大小、顏色、加粗、斜體等等,而對於行距控制,字距控制,段落控制等高級功能卻無能為力。 此時不免要提起一個非常強大的文本排版框架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]; 由於要展示連體字符,所以將前面使用的帶有中文的字符串換成 flush NSLigatureAttributeName的取值為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];