iOS 7 BUG - NSAttributedString不会出现 [英] iOS 7 BUG - NSAttributedString does not appear

查看:121
本文介绍了iOS 7 BUG - NSAttributedString不会出现的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

上周我问了一个关于模拟器错误的问题,NSAttributedString没有显示:在该代码中,我做了同样的事情来自另一端,因为它是:我给标签一个固定的宽度约束,但灵活的高度约束,并通过设置自己的高度,标签将其文本的顶部对着自己的顶部,因此能够正确显示文本。换句话说,这只是阻止标签垂直居中的另一种方式,这似乎是触发错误的原因。



进一步编辑

我感觉这个bug可能会在iOS 7.1中修复。


Last week I asked a question about a Simulator bug with NSAttributedString not displaying: iOS 7 Simulator Bug - NSAttributedString does not appear

Unfortunately it now appears this is not a simulator bug but an iOS 7 bug. I have now reproduced this issue on an iPhone 5 device.

The bug appears to be the combination of using NSUnderlineStyleAttributeName & NSParagraphStyleAttributeName as attributes for a NSAttributedString.

I have only tested on two iOS 7 devices so far, and the issue has only appeared on one of them. Even after they have both been upgraded to the exact same version:

  • 1st iPhone 5 with iOS 7.0 (11A465): Text does NOT appear

  • 1st iPhone 5 after upgrading to 7.0.2 (11A501): Text does NOT appear

  • 2nd iPhone 5 running iOS 7.0 (11A4449d): Text displays correctly

  • 2nd iPhone 5 after upgrading to 7.0.2 (11A501): Text does NOT appear

So it appears Apple introduced this bug after iOS 7.0 (11A4449d). I've filed a bug with them and will update you on any response I get.

Steps to reproduce bug

If you are running iOS 7.0.2 then you should be able to reproduce this bug.

Either download and run this project on your device https://github.com/rohinnz/iOS-7-BUG---NSAttributedString-does-not-appear

or

1) In Xcode 5 create a new 'Single View Application'. Call it whatever.

2) In ViewController.m, replace the viewDidLoad method with:

- (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) Compile and run on your device. Depending on your version of iOS 7, the text will either display, or will not. The UILabel's background color will display in both cases.

Screenshots

iPhone 5 with iOS 7.0 (11A465)

iPhone 5 with iOS 7.0 (11A4449d)

My Question

Is anyone able to reproduce this issue on a device?

解决方案

I have found a workaround for this bug. In your github code, to use the workaround, you would say this:

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; // <---

I have made two changes: I've appended a newline character to your original string, and I've set the label's numberOfLines to 2.

What the workaround does is to force the label's text up against the top of the label. This seems to solve the problem. In other words, the bug appears to stem from the label's attempt to vertically center its text; if you deliberately make the text too long for the size of the label by juggling the label's height, numberOfLines, and excess newline characters at the end of the text, the attributed string will be drawn.

EDIT I've just found another workaround along the same lines: let the label resize itself to fit the text. See my code and explanation here: https://stackoverflow.com/a/19545193/341994 In that code, I do the same thing from the opposite end, as it were: I give the label a fixed width constraint but a flexible height constraint, and by setting its own height, the label brings the top of its text up against the top of itself, and thus is able to display the text correctly. In other words, this is just another way of preventing the label from centering its text vertically, which is what seems to trigger the bug.

FURTHER EDIT I have the sense that this bug may get fixed in iOS 7.1.

这篇关于iOS 7 BUG - NSAttributedString不会出现的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆