Underline part of a string using NSMutableAttributedString in iOS 8 is not working Underline part of a string using NSMutableAttributedString in iOS 8 is not working ios ios

Underline part of a string using NSMutableAttributedString in iOS 8 is not working


Update:By investigating this question: Displaying NSMutableAttributedString on iOS 8 I finally found the solution!

You should add NSUnderlineStyleNone at the beginning of the string.

Swift 4.2 (none was removed):

let attributedString = NSMutableAttributedString()attributedString.append(NSAttributedString(string: "test ",                                           attributes: [.underlineStyle: 0]))attributedString.append(NSAttributedString(string: "s",                                           attributes: [.underlineStyle: NSUnderlineStyle.single.rawValue]))attributedString.append(NSAttributedString(string: "tring",                                           attributes: [.underlineStyle: 0]))

Objective-C:

 NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] init]; [attributedString appendAttributedString:[[NSAttributedString alloc] initWithString:@"test "                                                                          attributes:@{NSUnderlineStyleAttributeName: @(NSUnderlineStyleNone)}]]; [attributedString appendAttributedString:[[NSAttributedString alloc] initWithString:@"s"                                                                         attributes:@{NSUnderlineStyleAttributeName: @(NSUnderlineStyleSingle),                                                                                      NSBackgroundColorAttributeName: [UIColor clearColor]}]]; [attributedString appendAttributedString:[[NSAttributedString alloc] initWithString:@"tring"]];

Another bonus of such approach is absence of any ranges. Very nice for localized strings.

Seems like it is Apple bug :(


I found that if you apply UnderlineStyleNone to the whole string you can then selectively apply underline to a part that starts in the middle:

func underlinedString(string: NSString, term: NSString) -> NSAttributedString {    let output = NSMutableAttributedString(string: string)    let underlineRange = string.rangeOfString(term)    output.addAttribute(NSUnderlineStyleAttributeName, value: NSUnderlineStyle.StyleNone.rawValue, range: NSMakeRange(0, string.length))    output.addAttribute(NSUnderlineStyleAttributeName, value: NSUnderlineStyle.StyleSingle.rawValue, range: underlineRange)    return output}


NSMutableAttributedString *signUpString = [[NSMutableAttributedString alloc] initWithString:@"Not a member yet?Sign Up now"];[signUpString appendAttributedString:[[NSAttributedString alloc] initWithString:@" "attributes:@{NSUnderlineStyleAttributeName: @(NSUnderlineStyleNone)}]];[signUpString addAttributes: @{NSForegroundColorAttributeName:UIColorFromRGB(0x43484B),NSUnderlineStyleAttributeName:[NSNumber numberWithInteger:NSUnderlineStyleSingle]} range:NSMakeRange(17,11)];signUpLbl.attributedText = [signUpString copy];

It worked for me