Uitableview 在iOS 8上显示NSMutableAttributeString

Uitableview 在iOS 8上显示NSMutableAttributeString,uitableview,uilabel,ios8,xcode6,nsattributedstring,Uitableview,Uilabel,Ios8,Xcode6,Nsattributedstring,似乎在iOS 8.0(12A365)上,nsmutableAttributeString有时无法正确显示。当属性的范围不从文本开头开始时(如果没有其他属性从文本开头开始),显然会出现问题 1.)中的第二个单词“绿色”不会显示绿色背景(bug!)(“单元格”是一个UITableViewCell,其中UILabel“标签”作为子视图): 1.) 使用2.)和3.)可正确显示背景: (二) (三) 在此处查找屏幕截图和XCode 6项目: 对我来说,在iOS 8中似乎是一个bug,所以苹果公司有一份报

似乎在iOS 8.0(12A365)上,
nsmutableAttributeString
有时无法正确显示。当属性的范围不从文本开头开始时(如果没有其他属性从文本开头开始),显然会出现问题

1.)中的第二个单词“绿色”不会显示绿色背景(bug!)(“单元格”是一个
UITableViewCell
,其中
UILabel
“标签”作为子视图):

1.)

使用2.)和3.)可正确显示背景:

(二)

(三)

在此处查找屏幕截图和XCode 6项目:


对我来说,在iOS 8中似乎是一个bug,所以苹果公司有一份报告。

我在iOS 8中遇到了类似的NSAttributeString和NSLinkAttributeName属性问题。具体来说,从字符串开头开始的字符串(例如“www.cnn.com”)将按预期显示(使用drawWithRect:options:context:)。但是,如果我们在第一个字符(例如“text www.cnn.com”)之外添加链接,尽管属性正确,链接不会显示为蓝色或下划线。这些字符串通常具有包含整个字符串的属性,这似乎无关紧要,可能是因为“整个字符串”属性添加在NSLink属性之后。我尝试过交换顺序,以便在其他属性之后添加链接,但这并不能解决问题

到目前为止,我发现的唯一解决方法是在添加应用于整个字符串的属性后,使用下划线重新为链接添加属性,如下所示:

        [_attributedDisplayValue enumerateAttribute:NSLinkAttributeName
                                            inRange:displayValueRange
                                            options:0
                                         usingBlock:^(id value, NSRange range, BOOL *stop) {
                                             [_attributedDisplayValue addAttribute:NSUnderlineColorAttributeName
                                                                             value:[UIColor blueColor]
                                                                             range:range];
                                         }];

尝试此方法,首先在整个标签中使用透明颜色应用额外的NSBackgroundColorAttributeName

text = [[NSMutableAttributedString alloc] initWithString:@"Green is green. (-> Bug)"];
[text addAttribute:NSBackgroundColorAttributeName value:[UIColor clearColor] range:(NSRange){0,text.length}]; //Fix
[text addAttribute:NSBackgroundColorAttributeName value:[UIColor greenColor] range:(NSRange){9,5}];
cell.label.attributedText=text

这不再是一个问题(iOS 9.0)-

我也看到了这一点,尝试在标签的一部分加下划线。这真是一个令人讨厌的倒退。@Darcy:谢谢你的评论。您可以尝试在(NSRange){0,1}添加另一个虚拟属性(如清晰彩色背景…)-对我来说,这是1.)的一个解决方法,如上所述。您是否向Apple提交了错误报告?我正在讨论同样的问题。谢谢你的回答!在我看来,你的解决方法与我对达西的评论中所描述的相似或相同。顺便说一句,坏消息是,在iOS 8.0.2中,这个问题仍然存在……这是一个修复,至少应该被认为是正确的答案。在iOS 8中,文本删除线没有出现在中间范围。这修正了它-10倍。错误应该报告给苹果。
text = [[NSMutableAttributedString alloc] initWithString:@"Green is green. (-> Ok)"];
[text addAttribute:NSBackgroundColorAttributeName value:[UIColor greenColor] range:(NSRange){0,5}];
cell.label.attributedText=text
        [_attributedDisplayValue enumerateAttribute:NSLinkAttributeName
                                            inRange:displayValueRange
                                            options:0
                                         usingBlock:^(id value, NSRange range, BOOL *stop) {
                                             [_attributedDisplayValue addAttribute:NSUnderlineColorAttributeName
                                                                             value:[UIColor blueColor]
                                                                             range:range];
                                         }];
text = [[NSMutableAttributedString alloc] initWithString:@"Green is green. (-> Bug)"];
[text addAttribute:NSBackgroundColorAttributeName value:[UIColor clearColor] range:(NSRange){0,text.length}]; //Fix
[text addAttribute:NSBackgroundColorAttributeName value:[UIColor greenColor] range:(NSRange){9,5}];
cell.label.attributedText=text