iOS 7 BUG - NSAttributedString不会出现

时间:2013-10-01 23:45:28

标签: ios7 xcode5 nsattributedstring

上周我问了一个关于模拟器错误的问题,NSAttributedString没有显示:iOS 7 Simulator Bug - NSAttributedString does not appear

不幸的是,现在看来这不是模拟器错误,而是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后的第二部iPhone 5(11A501):文字未出现

所以看来Apple在iOS 7.0(11A4449d)之后引入了这个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];
}

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

截图

带有iOS 7.0的iPhone 5(11A465)

iPhone 5 with iOS 7.0 (11A465)

带有iOS 7.0的iPhone 5(11A4449d)

iPhone 5 with iOS 7.0 (11A4449d)

我的问题

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

7 个答案:

答案 0 :(得分: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; // <---

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

解决方法的作用是强制标签的文本贴在标签的顶部。这似乎解决了这个问题。换句话说,这个错误似乎源于标签试图垂直居中的文本;如果你故意在标签的尺寸文本太长由杂耍标签的高度,numberOfLines,并在文本的末尾多余的换行符,该属性串会被吸引。

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

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

答案 1 :(得分:6)

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

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

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

答案 2 :(得分:3)

我的申请中遇到了同样的问题。它发生在模拟器和我的设备上(iPhone 5运行7.0.2(11A501))。然后我意识到生活在其他ViewControllers中的UILabels正在使用NSUnderlineStyleSingle属性正确显示NSAttributedStrings。

经过一些故障排除。看起来如果你使用的是默认字体(我使用的是System 17.0)并且你的UILabel的高度小于62像素,无论你使用什么背景颜色,文字颜色或对齐方式,它都会正确显示。将UILabel的高度更改为大于61像素的值,允许自动调整大小以更改高度,或者将字体更改为自定义格式将导致带下划线的NSAttributedText消失。

起初我认为这个问题可能是由于我将UILabel置于新状态栏(或缺少状态栏)后面,但即使在与这个新功能相互作用的位置,高度规则仍然存在。我发现很难相信UILabel的高度会引起这样的问题,但这就是我得出的结论。

答案 3 :(得分:3)

哇,我花了一段时间才发现这个。看起来我和Indi有类似的问题。设置属性字符串的背景颜色会导致文本消失。只有我可以重现的地方是在运行iOS 7.0.3的设备上。

答案 4 :(得分:1)

解决方法:使用图像视图

CGRect rect = self.frame;

CGRect rr = [attribText boundingRectWithSize:rect.size options:NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesDeviceMetrics context:nil];
UIGraphicsBeginImageContextWithOptions(rr.size, NO, 0.);
[attribText drawWithRect:rr options:NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesDeviceMetrics context:nil];
UIImage* image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
UIImageView *imView = [[UIImageView alloc]initWithImage:image];
[self addSubview:imView];

答案 5 :(得分:0)

我注意到这个问题以类似的方式发生,但结果却出现了不同的解决方案。字符串有时会消失,而上面提出的解决方案有助于确保文本不会消失,文本通常会显示没有我设置的任何属性(删除线,不同的颜色等)

以下是设置:

使用Xcode 6.1.1和iOS SDK 8.1构建的使用spring和struts的遗留项目。与iPhone设备相比,iPad设备上的问题更为明显(iPhone上约占5%,iPad上约占95%)。无论我使用numberOfLinessizeToFit还是其他方法,这些属性都无法在iPad或iPhone上100%正确显示。

解决方案是切换到自动布局并使用上面的解决方案(numberOfLines = 2sizeToFit对我的情况来说似乎是可选的)

UILabels使用Springs和Struts进行水平拉伸时,似乎存在属性文本的错误。

希望这有助于某人!

答案 6 :(得分:0)

我也遇到了这个问题,它只能在特定语言和iOS 7.0上显示,当我想用​​中文强化文本时,我遇到了这个问题,解决了 [label sizeToFit] 希望它会有所帮助;)

顿。