NSMutableAttributedString's attribute NSStrike

2020-02-26 10:24发布

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?

6条回答
男人必须洒脱
2楼-- · 2020-02-26 10:35

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

查看更多
一夜七次
3楼-- · 2020-02-26 10:36

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

查看更多
The star\"
4楼-- · 2020-02-26 10:38

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)];
查看更多
叛逆
5楼-- · 2020-02-26 10:52

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.

查看更多
SAY GOODBYE
6楼-- · 2020-02-26 10:52

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

查看更多
放荡不羁爱自由
7楼-- · 2020-02-26 10:58
NSMutableAttributedString *str2 = [[NSMutableAttributedString alloc] initWithString:@"bbbb" attributes:@{NSStrikethroughStyleAttributeName:[NSNumber numberWithInteger:NSUnderlineStyleNone]}];

it should help

查看更多
登录 后发表回答