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?
When you add
NSStrikethroughStyleAttributeName
, you should also addNSBaselineOffsetAttributeName
, which is set to 0. And in swift, you should use the rawValue ofNSUnderlineStyl
e.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:
effective result <= iOS8.1.1
When you are not starting the index from 0, try this:
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.
I see the same issue and changing NSStrikethroughStyleAttributeName's value to NSUnderlineStyleNone doesn't fix it. Sure seems like iOS 8 bug.
it should help