【问题标题】:boundingRectWithSize:options:attributes:context: is not returning accurate expected UILabel sizeboundingRectWithSize:options:attributes:context: 没有返回准确的预期 UILabel 大小
【发布时间】:2014-12-23 03:12:04
【问题描述】:

我正在编写一个 iPhone 应用程序,其中我正在创建一个在运行时具有动态内容的 UILabel。我无法控制 UILabel 的内容,因此我必须计算它的大小,以便以后可以使用这些大小值来设置一些 UI 约束。

我正在使用以下代码创建 UILabel 并计算其预期大小:

UILabel *titleLabel = [[UILabel alloc] init];

titleLabel.font = [UIFont fontWithName:@"Arial-Bold" size:20];
titleLabel.numberOfLines = 0;
titleLabel.text = @"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer vulputate venenatis justo in ultrices. Pellentesque eu pharetra elit, id faucibus mi.";


//Calculate the expected lable size
CGRect applicationFrame = [[UIScreen mainScreen] applicationFrame];
CGFloat contentWidth = applicationFrame.size.width - 20; // 20 is 10+10, a margin of 10 from each side

CGSize maximumLabelSize = CGSizeMake(contentWidth, FLT_MAX); // FLT_MAX here simply means max possible height

CGRect expectedLabelSize = [titleLabel.text boundingRectWithSize:maximumLabelSize
                                                         options:(NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading)
                                                      attributes:@{
                                                                   NSFontAttributeName:titleLabel.font
                                                                   }
                                                         context:nil];

当我运行上面的代码时,expectedLabelSize.size.width 的值有时会大于传递给boundingRectWithSize:options:attributes:context: 的原始contentWidth 值。如何确保 contentWidth 是最大宽度?这很重要,因为我稍后会在某些约束中使用这些值,并且此最大宽度保持不变很重要。

谢谢。

【问题讨论】:

  • 也许你想初始化 contentWidth 时的 double = 导致了问题?
  • 感谢您指出这一点,但不幸的是,不,这是我在编辑正在编写的问题时发生的错误。检查了我的代码,没问题。

标签: ios objective-c iphone width uilabel


【解决方案1】:

Apple's reference,有一个有趣的讨论:

此方法返回字符串中字形的实际边界。 某些字形(例如空格)可以与 由传入的大小指定的布局约束,因此在某些情况下 返回的 CGRect 的 size 分量的宽度值可以 超过size参数的宽度值。

这应该是您正在寻找的。结果宽度是否比您给出的“最大值”大很多?如果不是,我猜讨论会回答你。

【讨论】:

  • 它并没有大多少,可能是几个像素或三个像素。但是,这会影响整个布局。但是,如果这只是由于空白,那么我认为这不会导致问题,因为我将设置固定的最大宽度,因此截断的空白不会导致问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-11-06
  • 1970-01-01
  • 2018-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多