【问题标题】:iOS 7 BUG - NSAttributedString does not appeariOS 7 BUG - NSAttributedString 不出现
【发布时间】:2013-10-08 07:12:11
【问题描述】:

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

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

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

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

  • 第一个带有 iOS 7.0 (11A465) 的 iPhone 5:文本不显示

  • 升级到 7.0.2 (11A501) 后的第一部 iPhone 5:文本不出现

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

  • 升级到 7.0.2 (11A501) 后的第二部 iPhone 5:文本不出现

因此,Apple 似乎在 iOS 7.0 (11A4449d) 之后引入了此错误。我已经向他们提交了一个错误,并将在收到任何回复时更新您。

重现错误的步骤

如果您运行的是 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 (11A465) 的 iPhone 5

装有 iOS 7.0 (11A4449d) 的 iPhone 5

我的问题

有人可以在设备上重现此问题吗?

【问题讨论】:

  • 您可能想要创建一个说明错误的最小项目,将其托管在 github 上或其他地方,并通过 developer.apple.com/bug-reporting 打开错误,指向错误报告中的 github 项目。
  • 好主意,我很快就会上传一些东西到 github。我已经向 Apple 提交了一个错误,但我不希望他们很快回复,因为他们还没有回复我不久前向他们提出的另一个 iOS 7 错误。
  • 我通过在属性文本上使用背景色并在旋转设备时调整 uilabel 的大小发现了类似的结果。如果我不使用背景色,一切都可以正常工作。更改宽度后使用背景颜色,文本消失。在旋转回原来的文本再次出现。
  • UILabel 只是马车。 NSTextAttachments 也会导致文本行消失,但与标签的高度成反比。看到这个问题:stackoverflow.com/q/19253224/1580288
  • 我认为我的第二个解决方法是让标签调整自己的高度,这是解决此问题的完全可靠的解决方案。

标签: ios7 xcode5 nsattributedstring


【解决方案1】:

我找到了解决此错误的方法。在您的 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 在该代码中,我从另一端做同样的事情,因为它是:我给标签一个固定的宽度约束但一个灵活的高度约束,并通过设置它自己的高度, label 将其文本的顶部放在自身的顶部,因此能够正确显示文本。换句话说,这只是防止标签垂直居中其文本的另一种方法,这似乎是触发错误的原因。

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

【讨论】:

  • 在 iOS 8 中遇到了这个问题。只需将numberOfLines 设置为 2 即可解决问题。在搜索问题之前花了将近 2 个小时试图找出我的错误。谢谢。
  • 在 iOS 8 中相同。花了很长时间试图解决这个问题!非常感谢。
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

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

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

    起初我认为这个问题可能是由于我将 UILabel 放置在新状态栏后面(或没有放置),但即使在与这个新功能交互的位置,高度规则仍然存在。我很难相信 UILabel 的高度会导致这样的问题,但这是我得出的结论。

    【讨论】:

    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

      解决方法:使用图像视图

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

      【讨论】:

        【解决方案6】:

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

        设置如下:

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

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

        当弹簧和支柱水平拉伸时,UILabels 上的属性文本似乎存在错误。

        希望这对某人有所帮助!

        【讨论】:

          【解决方案7】:

          我也遇到了这个问题,它只在特定语言和 iOS 7.0 上出现,当我想用​​中文下划线时遇到这个问题,解决了 [ label sizeToFit] 希望它会有所帮助;)

          康斯坦丁。

          【讨论】:

            猜你喜欢
            • 2013-09-30
            • 2013-10-03
            • 2014-02-01
            • 1970-01-01
            • 1970-01-01
            • 2013-10-04
            • 1970-01-01
            • 2013-12-17
            • 2013-10-12
            相关资源
            最近更新 更多