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

我有一个可变的归属string没有NSStrikethroughStyleAttributeName属性是这样的:

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

另一个带有NSStrikethroughStyleAttributeName属性的可变属性string,如下所示:

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

和一个包含两个string的整个string:

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

当我把整个string附加到UILabel时:

 _label.attributedText = labelString; 

它在iOS7和iOS8中都很好地显示,如下所示:

AAAA BBBB

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

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

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

ios7:bbbb AAAA ios8:bbbbaaaa

看来,在iOS8中,如果属性string中的第一个字符未被清除,则UILabel不会正确地显示删除线。 我认为这是iOS8的一个bug,有没有人遇到同样的问题?

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

它应该帮助

iOS8.1.1上,与设置NSStrikethroughStyleAttributeName一样,我们在设置NSMutableAttributedString时遇到了更多的问题。

如果你的属性不改变尝试这个,它会。

我开始推理UILabel,这是灵魂chaneger属性,所以如果我们假设NSStrikethroughStyleAttributeName没有初始化标签文本,所以我们需要初始化它。

我所做的是通过none NSStrikethroughStyleAttributeName初始化mutableAttributedString,并将此属性更改为突出显示:result是:

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

有效的结果<= iOS8.1.1

修复iOS8中的错误:通过清除颜色的string的第一个字母,然后通过你想要的范围内的文本。

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

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

当你添加NSStrikethroughStyleAttributeName ,你还应该添加NSBaselineOffsetAttributeName ,它被设置为0.而在swift中,你应该使用NSUnderlineStyl e的NSUnderlineStyl 。 在这里input图像描述

我看到相同的问题,并将NSStrikethroughStyleAttributeName的值更改为NSUnderlineStyleNone不解决此问题。 当然,似乎像iOS 8的错误。