Reputation: 73
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?
Upvotes: 7
Views: 6429
Reputation: 101
When you add NSStrikethroughStyleAttributeName
, you should also add NSBaselineOffsetAttributeName
, which is set to 0. And in swift, you should use the rawValue of NSUnderlineStyl
e.
Upvotes: 1
Reputation: 440
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)];
Upvotes: 1
Reputation: 209
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
Upvotes: 8
Reputation: 59
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.
Upvotes: 3
Reputation: 1
I see the same issue and changing NSStrikethroughStyleAttributeName's value to NSUnderlineStyleNone doesn't fix it. Sure seems like iOS 8 bug.
Upvotes: 0
Reputation: 116
NSMutableAttributedString *str2 = [[NSMutableAttributedString alloc] initWithString:@"bbbb" attributes:@{NSStrikethroughStyleAttributeName:[NSNumber numberWithInteger:NSUnderlineStyleNone]}];
it should help
Upvotes: 10