NSMutableAttributedString的属性NSStrikethroughStyleAttributeName在iOS8中不能正确工作

7
我有一个可变的属性字符串,不含有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中都能很好地显示,如下所示:

aaaabbbb

但是当我交换它们的位置时:

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

在iOS7中显示正确,但在iOS8中显示不正确。

ios7: bbbbaaaa ios8: bbbbaaaa

在iOS8中,似乎UILabel无法正确呈现删除线,如果属性字符串中的第一个字符没有删除线,则会出现问题。我认为这是iOS8中的一个错误,有没有遇到相同问题的人?


我遇到了完全相同的问题。你提出了一个雷达吗? - Oliver Pearmain
1
我刚刚添加了雷达#18409995。 - Oliver Pearmain
我现在也添加了一个开放雷达:http://openradar.appspot.com/18409995(一直在提高IOS8的数量,所以我可能也学习一下开放雷达的工作原理) - Oliver Pearmain
6个回答

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

它应该有所帮助


这也神奇地解决了我的问题。我试图通过设置颜色和NSRangeNSBackgroundColorAttributeName来突出显示属性字符串的一部分。该代码在iOS 7上完美运行,但我发现在iOS 8中,只有当范围的位置为0时,突出显示才有效;任何其他值都不会被绘制。使用您的代码创建属性字符串以某种方式解决了我的问题。 - MusiGenesis

8
On iOS8.1.1,我们在设置NSMutableAttributedString方面遇到了更多的问题,比如使用NSStrikethroughStyleAttributeName。
如果你的属性没有改变,尝试这个方法,它会起作用的。
我从UILabel开始推理,这是一个改变属性的精神,所以如果我们假设NSStrikethroughStyleAttributeName没有初始化标签文本,那么我们需要对其进行初始化。
我的做法是用不含NSStrikethroughStyleAttributeName的mutableAttributedString进行初始化,并将此属性更改为高亮显示:
结果如下:
NSMutableAttributedString * string = [[NSMutableAttributedString alloc] initWithString: myString attributes: @ {NSStrikethroughStyleAttributeName: @ (NSUnderlineStyleNone)}];
             [string addAttributes: @ {NSStrikethroughStyleAttributeName: @ (NSUnderlineStyleSingle)} range: [myString rangeOfString: mySubString]];
[MyLabel setAttributedText: string];

有效结果 <= iOS8.1.1


当MyLabel.numberOfLines不为1时,它可以工作。我在iOS 8.1模拟器中进行了测试。 - Joey

3
在iOS8中修复了一个错误:用透明颜色添加删除线来划掉字符串的第一个字母,然后在任何想要的范围内给文本加删除线。

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)];

1
当您添加NSStrikethroughStyleAttributeName时,还应该添加NSBaselineOffsetAttributeName,并将其设置为0。在Swift中,您应该使用NSUnderlineStyle的rawValue。

enter image description here


0

我遇到了同样的问题,将NSStrikethroughStyleAttributeName的值更改为NSUnderlineStyleNone并不能解决它。看起来确实是iOS 8的一个bug。


2
不要将值更改为NSUnderlineStyleNone。只需为未被删除线覆盖的文本添加一个NSStrikethroughStyleAttributeName属性,其值为NSUnderlineStyleNone。 - Richard

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接