问题:假设宽度为300像素,请确定UILabel所需的大小(行数)。字符串较长,因此我将lineBreakMode设置为UILineBreakModeWordWrap并调用sizeThatFits尝试确定大小。但它在单行中的宽度为457像素,而不是在两行中的预期300像素。

请参阅:

CGSize available = CGSizeMake(300, INFINITY);
UILabel *label = [[[UILabel alloc] initWithFrame:CGRectMake(0, 0, 300, 400)] autorelease];
label.text = title;
label.lineBreakMode = UILineBreakModeWordWrap;
label.font = [UIFont fontWithName:kBoldFont size:kTitleFontSize];
label.numberOfLines = 3;
CGSize sizedtoFit = [label sizeThatFits:available];

但是我发现sizetoFit变量的宽度为457像素,高度为22 px,并且UI用剪切后的文本显示一行。我期望两行的宽度为300像素,高度为44 px。

用于numberoflines的UILabel文档说:

使用sizeToFit方法调整接收器的大小时,调整大小时会考虑存储在此属性中的值。例如,如果将此属性设置为3,则sizeToFit方法将调整接收者的大小,使其足够大以显示三行文本。

我尝试了以下各种组合:
  • CGRectZero传递给init函数,传递300x400或300 x无穷大。
  • 在创建后设置框架,而不是将其传递给init函数。
  • 调用[sizeToFit]并希望它假设当前宽度来计算高度,但事实并非如此。
  • 调用sizeToFit,然后调用sizeThatFits`。
  • 调用layoutIfNeeded

  • 它们都不起作用。我在做什么错,或者这是文档和框架实现不一致的错误?谢谢。

    最佳答案

    我遇到了同样的问题,适合的尺寸只是忽略了尺寸... /:
    我最终使用:

    CGRect textSize = [UILabel textRectForBounds:CGRectMake(0, 0, 300, CGFLOAT_MAX)
                          limitedToNumberOfLines:3];
    

    奇迹般有效... :)

    文档说您不应该直接调用它,但是我已经使用了一段时间了,并且已经批准了提交的应用程序,而且一切都很棒... :)

    关于iphone - UILabel的sizeToFit/sizeThatFits忽略numberoflines属性,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5041874/

    10-13 04:01