【问题标题】:UILabel rendering issue using boundingRectWithSize in iOS 7.0.3在 iOS 7.0.3 中使用 boundingRectWithSize 的 UILabel 渲染问题
【发布时间】:2014-05-09 07:59:56
【问题描述】:

我正在尝试调整 UILabel 的大小以适应 NSString 的范围,但我在 iOS 7.0.3 和 iOS 7.1.1 中看到了不同的结果。正如您在下面看到的,iOS 7.0.3 似乎无法正确绘制文本。

示例 1:文本向标签底部绘制,几乎超出边界:

示例 2:文本绘制在 1 行(而不是 2 行)上,并且不发生自动换行,只有尾部截断。

这是我在上面列出的两个 iOS 版本中使用的代码。

CGSize boundingSize = CGSizeMake(214, 9999);
CGRect boundingRect = CGRectZero;
[self.nameLabel setNumberOfLines:2];

// for iOS7
if([self.place.placeName respondsToSelector:@selector(boundingRectWithSize:options:attributes:context:)]){
    NSMutableParagraphStyle *paragraphStyle = [[NSParagraphStyle defaultParagraphStyle] mutableCopy];
    [paragraphStyle setLineBreakMode:NSLineBreakByWordWrapping];

    boundingRect = [self.place.placeName boundingRectWithSize:boundingSize
                                                      options:NSStringDrawingUsesLineFragmentOrigin
                                                   attributes:[NSDictionary dictionaryWithObjectsAndKeys:
                                                               self.nameLabel.font, NSFontAttributeName,
                                                               paragraphStyle, NSParagraphStyleAttributeName, nil]
                                                      context:nil];

}else{
    // pre iOS7
    CGSize size = [self.place.placeName sizeWithFont:self.nameLabel.font constrainedToSize:boundingSize lineBreakMode:NSLineBreakByWordWrapping];
    boundingRect = CGRectMake(0, 0, size.width, size.height);
}

[self.nameLabel setFrame:CGRectMake(CGRectGetMaxX(self.photoImageView.frame)+15,
                                    CGRectGetMinY(self.photoImageView.frame),
                                    boundingRect.size.width, boundingRect.size.height)];

[self.nameLabel setText:[place placeName]];

有什么想法吗?提前致谢。

【问题讨论】:

    标签: ios objective-c uilabel sizewithfont


    【解决方案1】:

    我已就此问题与 Apple 联系,他们已确认这是 iOS 7.0.3 的错误,已在 iOS 7.1.1 中修复。

    这个问题的解决方法(我曾经使用过)是创建自己的 UILabel 子类,覆盖 - (void)drawTextInRect: 方法,并使用 NSString 的 - (void)drawInRect:withAttributes: 来渲染字符串。 (苹果开发者)

    【讨论】:

      【解决方案2】:

      只是猜测。从屏幕截图看起来,较短的标签是文字包装的,这表明宽度太短了。似乎对boundingRectWithSize 的调用的实现可能以某种微妙的方式从一个iOS 版本更改为另一个版本。它也可能与动态字体有关,谁知道呢。

      您应该尝试/检查以下几点:

      • 确保 numberOfLines 属性设置为 0(或至少一个足够高的数字以允许换行,即不是 1
      • boundingRect 提供允许的最大宽度。
      • 检查自动布局约束是否在稍后阶段更改标签的框架

      【讨论】:

      • 我已经检查了所有三个问题,但问题仍然存在。
      【解决方案3】:

      使用 numberOfLines 属性设置为至少足够高的数字以允许换行,即 labelheight/20(更改大小和测试)。

      【讨论】:

      • 我尝试了 3、0 甚至 100。结果相同。请在下面查看我的回答,因为这是 7.0.3 的一个已知错误。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-05-12
      • 1970-01-01
      • 1970-01-01
      • 2019-03-04
      • 1970-01-01
      • 1970-01-01
      • 2023-04-06
      相关资源
      最近更新 更多