簡體   English   中英

如何使NSAttributedString的下划線樣式屬性起作用?

[英]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布局引擎將忽略該屬性,並在控制台中生成警告。 無助地,警告沒有提及underlineStyleNSUnderlineStyle

這個問題很常見。 StackOverflow上有很多示例顯示了正確的用法。 但是,雖然我確定必須有一些答案可以解釋該問題,但我已閱讀的答案僅顯示了用法的不透明示例。

提出這個問題(並在下面給出答案)是為了紀念對該問題的解釋,以便將來我和其他人可以從中學習。

NSUnderlineStyle不是正確的類型

准確但有些無助的是, 文檔解釋說underlineStyle屬性鍵采用的屬性值為“包含整數的NSNumber ”。

該屬性的值是一個包含整數的NSNumber對象。 此值指示文本是否帶下划線,並對應於NSUnderlineStyle中描述的常量之一。 此屬性的默認值為styleNone。

許多讀者被吸引到NSUnderlineStyle ,點擊它,並找到風格的枚舉類列表: singlethickpatternDashdouble ,等這一切都似乎是一個很好的解決方案SWIFTY。 讀者認為此枚舉必須是指定屬性值的方式,並鍵入上面問題中所示的代碼種類。


rawValue的物業NSUnderlineStyle提供適當的類型

NSUnderlineStyle不是一個枚舉。 它是符合OptionSet協議的結構。 OptionSet協議是一種方便,快捷的方法,用於設置整數的位,每個位代表二進制狀態。 NSUnderlineStyle結構是該整數的包裝器。 它的類似於枚舉的樣式實際上是結構上的靜態var,每個靜態var返回帶有嵌入式整數的NSUnderlineStyle的實例,只有一位翻轉以對應於所需樣式。

NSAttributedString的屬性字典實際上將任何東西都當作一個值,因此它很高興地接受NSUnderlineStyle實例。 但是,使UITextViewUILabel工作的引擎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方法合並下划線樣式

我們可以將多個下划線樣式組合成一個復合樣式。 在按位級別上,這是通過對代表兩種樣式的整數進行邏輯或來實現的。 作為一個OptionSetNSUnderlineStyle提供了NSUnderlineStyle替代方案。 NSUnderlineStyle上的union(_:)方法以更簡單的英語方式實現邏輯或。 舉個例子:

NSUnderlineStyle.double.union(.patternDot).rawValue

這段代碼產生一個具有適當位翻轉的Int ,而TextKit繪制了一個非常漂亮的虛線雙下划線。 當然,並非所有組合都可以。 'NSAttributedString'可以接受任何內容,但是常識和TextKit引擎最終將決定。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM