![](/img/trans.png)
[英]How to apply color for underline style in NSAttributedString (ios)?
[英]How to get NSAttributedString's underline style attribute to work?
使用NSAttributedString
,我想在字符串的下划線下划線。 以下代碼無法正常工作:
let string = NSMutableAttributedString(string: "This is my string.")
string.addAttributes([.underlineStyle : NSUnderlineStyle.single],
range: NSRange(location: 5, length: 2))
人們期望“是”要強調。 相反,UITextView布局引擎將忽略該屬性,並在控制台中生成警告。 無助地,警告沒有提及underlineStyle
或NSUnderlineStyle
。
這個問題很常見。 StackOverflow上有很多示例顯示了正確的用法。 但是,雖然我確定必須有一些答案可以解釋該問題,但我已閱讀的答案僅顯示了用法的不透明示例。
提出這個問題(並在下面給出答案)是為了紀念對該問題的解釋,以便將來我和其他人可以從中學習。
NSUnderlineStyle
不是正確的類型 准確但有些無助的是, 文檔解釋說underlineStyle
屬性鍵采用的屬性值為“包含整數的NSNumber
”。
該屬性的值是一個包含整數的NSNumber對象。 此值指示文本是否帶下划線,並對應於NSUnderlineStyle中描述的常量之一。 此屬性的默認值為styleNone。
許多讀者被吸引到NSUnderlineStyle
,點擊它,並找到風格的枚舉類列表: single
, thick
, patternDash
, double
,等這一切都似乎是一個很好的解決方案SWIFTY。 讀者認為此枚舉必須是指定屬性值的方式,並鍵入上面問題中所示的代碼種類。
rawValue
的物業NSUnderlineStyle
提供適當的類型 NSUnderlineStyle
不是一個枚舉。 它是符合OptionSet
協議的結構。 OptionSet
協議是一種方便,快捷的方法,用於設置整數的位,每個位代表二進制狀態。 NSUnderlineStyle
結構是該整數的包裝器。 它的類似於枚舉的樣式實際上是結構上的靜態var,每個靜態var返回帶有嵌入式整數的NSUnderlineStyle
的實例,只有一位翻轉以對應於所需樣式。
NSAttributedString
的屬性字典實際上將任何東西都當作一個值,因此它很高興地接受NSUnderlineStyle
實例。 但是,使UITextView
和UILabel
工作的引擎TextKit不知道如何處理NSUnderlineStyle
實例。 當TextKit嘗試呈現underlineStyle
屬性時,它需要一個整數,以便可以通過檢查整數的位來確定正確的樣式。
幸運的是,有一種簡單的方法可以獲取該整數。 rawValue
屬性對其進行NSUnderlineStyle
。 因此,我們的代碼段的正常工作版本如下:
let string = NSMutableAttributedString(string: "This is my string.")
string.addAttributes([.underlineStyle : NSUnderlineStyle.single.rawValue],
range: NSRange(location: 5, length: 2))
此代碼與問題代碼之間的唯一區別是在“ NSUnderlineStyle.single”上添加了“ .rawValue”。 並且,“是”下划線。
附帶說明一下, rawValue
屬性提供的類型是Int
,而不是NSNumber
。 文檔對屬性值為NSNumber
的引用可能會造成混淆。 為了與ObjC互操作, NSAttributedString
在內部將Int
包裝在NSNumber
。 不需要(或沒有好處?)將Int
顯式包裝在NSNumber
。
OptionSet
union
方法合並下划線樣式 我們可以將多個下划線樣式組合成一個復合樣式。 在按位級別上,這是通過對代表兩種樣式的整數進行邏輯或來實現的。 作為一個OptionSet
, NSUnderlineStyle
提供了NSUnderlineStyle
替代方案。 NSUnderlineStyle
上的union(_:)
方法以更簡單的英語方式實現邏輯或。 舉個例子:
NSUnderlineStyle.double.union(.patternDot).rawValue
這段代碼產生一個具有適當位翻轉的Int
,而TextKit繪制了一個非常漂亮的虛線雙下划線。 當然,並非所有組合都可以。 'NSAttributedString'可以接受任何內容,但是常識和TextKit
引擎最終將決定。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.