在iOS 7.0.3中使用boundingRectWithSize的UILabel渲染问题

时间:2014-05-09 07:59:56

标签: ios objective-c uilabel sizewithfont

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

示例1:文本绘制在标签的底部,几乎在边界之外:

enter image description here

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

enter image description here

以下是我在上面列出的两个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]];

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

3 个答案:

答案 0 :(得分:3)

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

  

该问题的解决方法(我以前使用)是创建自己的UILabel子类,覆盖 - (void)drawTextInRect:方法,并使用NSString的 - (void)drawInRect:withAttributes:来呈现字符串。 (Apple Developer)

答案 1 :(得分:0)

猜猜。从截图看起来,就像较短的标签是自动换行的,这表明宽度太短了。似乎对boundingRectWithSize的调用的实现可能已经从一个iOS版本到另一个版本以某种微妙的方式发生了变化。它也可能与动态字体有关,谁知道。

以下是您应该尝试/检查的一些事项:

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

答案 2 :(得分:0)

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