Kyle
Kyle

Reputation: 4449

Setting kCTUnderlineStyleAttributeName for an NSMutableAttributedString in Swift

The documentation for kCTUnderlineStyleAttributeName relays the following:

kCTUnderlineStyleAttributeName The style of underlining, to be applied at render time, for the text to which this attribute applies. Value must be a CFNumber object. Default is kCTUnderlineStyleNone. Set a value of something other than kCTUnderlineStyleNone to draw an underline. In addition, the constants listed in CTUnderlineStyleModifiers can be used to modify the look of the underline. The underline color is determined by the text's foreground color.

The signature for the setAttributes function is as follows:

func setAttributes(attrs: [NSObject : AnyObject]?, range: NSRange)

The issue that I'm having is that the documentation seems to allude to the fact that CTUnderlineStyle.Single can (and should, in Swift) be used as a value for the kCTUnderlineStyleAttributeName key. However, the former is a struct, and as a result does not conform to the AnyObject protocol required by the dictionaries value type.

Any ideas?

Upvotes: 4

Views: 1495

Answers (2)

iWheelBuy
iWheelBuy

Reputation: 5679

in swift 3 worked for me this code

let attributes:[AnyHashable : Any] = [kCTUnderlineStyleAttributeName as AnyHashable:NSNumber(value:CTUnderlineStyle.single.rawValue)]

Upvotes: 0

Vojtech Vrbka
Vojtech Vrbka

Reputation: 5368

I spend quite a few time on this.

The value needs to confront the AnyObject protocol.

Instead of using CTUnderlineStyle.Single use NSNumber like this:

NSNumber(int: CTUnderlineStyle.Single.rawValue)

Example:

attributedString.addAttribute(kCTUnderlineStyleAttributeName, value:NSNumber(int: CTUnderlineStyle.Single.rawValue), range:NSRange(location:0,length:attributedString.length));

Upvotes: 6

Related Questions