iOS 7 BUG - NSAttributedString不会出现

Roh*_*nNZ 27 nsattributedstring ios7 xcode5

上周我问了一个关于模拟器错误的问题,NSAttributedString没有显示:iOS 7模拟器错误 - NSAttributedString没有出现

不幸的是,现在看来这不是模拟器错误,而是iOS 7错误.我现在已经在iPhone 5设备上重现了这个问题.

该错误似乎是使用NSUnderlineStyleAttributeName和NSParagraphStyleAttributeName作为NSAttributedString的属性的组合.

到目前为止,我只测试了两台iOS 7设备,问题只出现在其中一台设备上.即使他们已经升级到完全相同的版本:

  • 带iOS 7.0的第一部iPhone 5(11A465):不显示文字

  • 升级到7.0.2后的第一个iPhone 5(11A501):不显示文本

  • 运行iOS 7.0的第二部iPhone 5(11A4449d):正确显示文本

  • 升级到7.0.2(11A501)后的第二部iPhone 5:不显示文字

所以看来Apple在iOS 7.0(11A4449d)之后引入了这个bug.我已经向他们提交了一个错误,并会根据我得到的任何回复更新您.

重现bug的步骤

如果您运行的是iOS 7.0.2,那么您应该可以重现此错误.

在您的设备上下载并运行该项目https://github.com/rohinnz/iOS-7-BUG---NSAttributedString-does-not-appear

要么

1)在Xcode 5中创建一个新的"单视图应用程序".什么都叫它.

2)在ViewController.m中,将viewDidLoad方法替换为:

- (void)viewDidLoad
{
    [super viewDidLoad];

    NSMutableParagraphStyle* paragraph = [[NSMutableParagraphStyle alloc] init];
    paragraph.alignment = NSTextAlignmentCenter;

    NSAttributedString* attrStr = [[NSAttributedString alloc] initWithString:@"Lorem ipsum dolor sit" attributes:
                                   @{NSUnderlineStyleAttributeName:@(NSUnderlineStyleSingle),
                                     NSParagraphStyleAttributeName:paragraph}];

    UILabel* myLabel = [[UILabel alloc] initWithFrame:CGRectMake(10, 30, 0, 0)];
    myLabel.backgroundColor = [UIColor greenColor];
    myLabel.attributedText = attrStr;
    [myLabel sizeToFit];

    [self.view addSubview:myLabel];
}
Run Code Online (Sandbox Code Playgroud)

3)编译并在您的设备上运行.根据您的iOS 7版本,文本将显示,或不显示.两种情况下都会显示UILabel的背景颜色.

截图

带有iOS 7.0的iPhone 5(11A465)

带有iOS 7.0的iPhone 5(11A465)

带有iOS 7.0的iPhone 5(11A4449d)

带有iOS 7.0的iPhone 5(11A4449d)

我的问题

有人能够在设备上重现此问题吗?

mat*_*att 14

我找到了这个bug的解决方法.在你的github代码中,要使用变通方法,你会这样说:

NSAttributedString* attrStr = 
    [[NSAttributedString alloc] initWithString:@"Lorem ipsum dolor sit\n" // <---
    attributes:
        @{NSUnderlineStyleAttributeName:@(NSUnderlineStyleSingle),
        NSParagraphStyleAttributeName:paragraph}];

UILabel* myLabel = [[UILabel alloc] initWithFrame:CGRectMake(10, 30, 0, 0)];
myLabel.backgroundColor = [UIColor greenColor];
myLabel.attributedText = attrStr;
[myLabel sizeToFit];

myLabel.numberOfLines = 2; // <---
Run Code Online (Sandbox Code Playgroud)

我做了两处更改:我在原始字符串中添加了换行符,并将标签设置numberOfLines为2.

解决方法的作用是强制标签的文本贴在标签的顶部.这似乎解决了这个问题.换句话说,这个错误似乎源于标签试图垂直居中的文本; 如果你故意通过标签的高度numberOfLines,以及文本末尾多余的换行符,使文本的长度超过标签的大小,则会绘制属性字符串.

编辑我刚刚在同一行找到了另一种解决方法:让标签调整自身大小以适应文本.请参阅我的代码和解释:https://stackoverflow.com/a/19545193/341994在该代码中,我从另一端做同样的事情,因为它是:我给标签一个固定的宽度约束,但灵活的高度约束,并通过设置自己的高度,标签将其文本的顶部与其自身的顶部对齐,从而能够正确显示文本.换句话说,这只是阻止标签垂直居中的另一种方式,这似乎是触发bug的原因.

进一步编辑我有一个感觉,这个错误可能会在iOS 7.1中修复.


Ind*_*ndi 6

在UITableViewCell中的UILabel文本上设置背景颜色时,我也遇到了同样的问题.我的解决方法是使用UITextView禁用UserInteraction而不是单元格中的UILabel,它可以工作.

更新:发现问题仅出现在Basic UITableViewCell中包含的UILabel中.

更新2:还发现当UILabel包装到多行文本时不会发生此问题.一种解决方法是通过添加换行符和空格来强制文本换行.非常hacky,但它的工作原理.确保numberOfLines设置为零,lineBreakMode设置为NSLineBreakByWordWrapping.