7

I have a mutable attributed string without NSStrikethroughStyleAttributeName attribute like this:

NSMutableAttributedString *str1 = [[NSMutableAttributedString alloc] initWithString:@"aaaa" attributes:@{NSStrikethroughStyleAttributeName:[NSNumber numberWithInteger:NSUnderlineStyleSingle]}];

and another mutable attributed string with NSStrikethroughStyleAttributeName attribute like this:

NSMutableAttributedString *str2 = [[NSMutableAttributedString alloc] initWithString:@"bbbb"];

and a whole string containing two strings above:

NSMutableAttributedString *labelString = [[NSMutableAttributedString alloc] init];
[labelString appendAttributedString:str1];
[labelString appendAttributedString:str2];

when I attach the whole string to a UILabel:

_label.attributedText = labelString;

It both display well in iOS7 and iOS8, like this:

aaaabbbb

But when I exchange their positions:

[labelString appendAttributedString:str2];
[labelString appendAttributedString:str1];

It display correctly in iOS7 but not correctly in iOS8

ios7: bbbbaaaa ios8: bbbbaaaa

It seems that in iOS8, UILabel doesn't render the strikethrough correctly if the first character in the attributed string is not strikethroughed. I think this is a bug in iOS8, is there anyone who encounter the same problem with me?

Richard
  • 73
  • 1
  • 3

6 Answers6

10
NSMutableAttributedString *str2 = [[NSMutableAttributedString alloc] initWithString:@"bbbb" attributes:@{NSStrikethroughStyleAttributeName:[NSNumber numberWithInteger:NSUnderlineStyleNone]}];

it should help

Yuriy Katkov
  • 116
  • 1
  • 2
  • This also magically fixed my problem. I was attempting to highlight part of an attributed string by setting the `NSBackgroundColorAttributeName` with a color and an `NSRange`. The code worked perfectly on iOS 7, but I found that in iOS 8 the highlighting only worked if the range had a location of 0; any other value and it wasn't drawn. Creating the attributed string with your code fixed my problem somehow. – MusiGenesis Oct 15 '14 at 15:02
8

On iOS8.1.1 we have more problems with setting NSMutableAttributedString, like with NSStrikethroughStyleAttributeName.

If your attributes are not changing try this and it will be.

I started reasoning by the UILabel that is spirit to chaneger attributes, so if we assume that the NSStrikethroughStyleAttributeName not initialized the label text so we will need the initialize it .

What I do is initializing mutableAttributedString by a none NSStrikethroughStyleAttributeName and change this attribute to highlight: result is:

 

NSMutableAttributedString * string = [[NSMutableAttributedString alloc] initWithString: myString attributes: @ {NSStrikethroughStyleAttributeName: @ (NSUnderlineStyleNone)}];
             [string addAttributes: @ {NSStrikethroughStyleAttributeName: @ (NSUnderlineStyleSingle)} range: [myString rangeOfString: mySubString]];
[MyLabel setAttributedText: string];

effective result <= iOS8.1.1

sharkbait
  • 2,980
  • 16
  • 51
  • 89
NSSakly
  • 209
  • 2
  • 11
3

Fix for the bug in iOS8: Strike Through first letter of the string with clear color and then Strike through the text in which ever range you want.

1

When you are not starting the index from 0, try this:

NSMutableAttributedString *attributedStr = [[NSMutableAttributedString alloc] initWithString:@"Hello"];
[attributedStr addAttributes:@{NSStrikethroughStyleAttributeName : @(NSUnderlineStyleSingle)} range:NSMakeRange(1, str.length)];
[attributedStr addAttributes:@{NSStrikethroughStyleAttributeName : @(NSUnderlineStyleNone)} range:NSMakeRange(0, 1)];
GEOCHET
  • 21,119
  • 15
  • 74
  • 98
Yahoho
  • 420
  • 4
  • 9
1

When you add NSStrikethroughStyleAttributeName, you should also add NSBaselineOffsetAttributeName, which is set to 0. And in swift, you should use the rawValue of NSUnderlineStyle.

enter image description here

Catarina Ferreira
  • 1,824
  • 5
  • 17
  • 26
贺彦文
  • 101
  • 1
  • 1
0

I see the same issue and changing NSStrikethroughStyleAttributeName's value to NSUnderlineStyleNone doesn't fix it. Sure seems like iOS 8 bug.

amit
  • 1
  • 2
  • 2
    Don't change the value to NSUnderlineStyleNone. Just add a NSStrikethroughStyleAttributeName attribute with value NSUnderlineStyleNone to those text which is not strikethroughed. – Richard Sep 24 '14 at 04:12