Search code examples
iosswiftnsmutableattributedstring

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?


Solution

  • 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));