NSMutableAttributedString的属性NSStrikethroughStyleAttributeName在iOS8中无法正常工作

时间:2014-09-21 05:40:09

标签: ios ios8 nsattributedstring strikethrough nsmutableattributedstring

我有一个没有NSStrikethroughStyleAttributeName属性的可变属性字符串,如下所示:

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

和另一个带有NSStrikethroughStyleAttributeName属性的可变属性字符串,如下所示:

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

以及包含上面两个字符串的整个字符串:

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

当我将整个字符串附加到UILabel时:

_label.attributedText = labelString;

它在iOS7和iOS8中都表现良好,如下所示:

<德尔> AAAA BBBB

但是当我交换他们的职位时:

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

它在iOS7中正确显示,但在iOS8中没有正确显示

ios7:bbbb aaaa ios8:bbbbaaaa

似乎在iOS8中,如果属性字符串中的第一个字符不是strikethroughed,则UILabel不会正确渲染删除线。 我认为这是iOS8中的一个错误,是否有人遇到过与我相同的问题?

6 个答案:

答案 0 :(得分:10)

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

它应该有帮助

答案 1 :(得分:8)

iOS8.1.1 上,设置 NSMutableAttributedString 会遇到更多问题,例如 NSStrikethroughStyleAttributeName

如果你的属性没有改变,请试试这个。它将是。

我开始使用UILabel作为chaneger属性的精神推理,所以如果我们假设NSStrikethroughStyleAttributeName没有初始化标签文本,那么我们将需要初始化它。

我所做的是通过none NSStrikethroughStyleAttributeName初始化mutableAttributedString并更改此属性以突出显示: 结果是:

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

有效结果&lt; = iOS8.1.1

答案 2 :(得分:3)

修复iOS8中的错误:使用清晰的颜色敲击字符串的第一个字母,然后在您希望的范围内搜索文本。

答案 3 :(得分:1)

当你没有从0开始索引时,试试这个:

NSMutableAttributedString *attributedStr = [[NSMutableAttributedString alloc] initWithString:@"Hello"];
[attributedStr addAttributes:@{NSStrikethroughStyleAttributeName : @(NSUnderlineStyleSingle)} range:NSMakeRange(1, str.length)];
[attributedStr addAttributes:@{NSStrikethroughStyleAttributeName : @(NSUnderlineStyleNone)} range:NSMakeRange(0, 1)];

答案 4 :(得分:1)

添加NSStrikethroughStyleAttributeName时,还应添加NSBaselineOffsetAttributeName,设置为0.在swift中,您应该使用NSUnderlineStyl e的rawValue。 enter image description here

答案 5 :(得分:0)

我看到同样的问题,并将NSStrikethroughStyleAttributeName的值更改为NSUnderlineStyleNone并没有修复它。当然看起来像iOS 8的bug。