UILabel的sizeToFit/sizeThatFits忽略numberoflines属性

Vad*_*ick 37 iphone cocoa-touch

问题:UILabel假设宽度为300像素,确定所需的尺寸(线数).字符串更长,所以我设置为lineBreakModeto 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];
Run Code Online (Sandbox Code Playgroud)

但我发现sizetoFit变量的宽度为457像素,高度为22像素,UI显示一条带有剪切文本的行.我预计宽度为300像素,两条线的高度为44像素.

数字线的UILabel文档说:

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

我尝试了各种组合:

  1. 传递CGRectZero给init函数,传递300x400或300 x无穷大.
  2. 在创建后设置框架而不是将其传递给init函数.
  3. 调用[sizeToFit]并希望它计算假设当前宽度的高度,但事实并非如此.
  4. 调用sizeToFit然后调用sizeThatFits`.
  5. 调用layoutIfNeeded.

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

Ale*_*Zak 23

我有同样的问题,大小适合忽略大小... /:我最终使用:

CGRect textSize = [UILabel textRectForBounds:CGRectMake(0, 0, 300, CGFLOAT_MAX) 
                      limitedToNumberOfLines:3];
Run Code Online (Sandbox Code Playgroud)

奇迹般有效... :)

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

  • 好吧,我不想做文档说你不应该做的事情,除非作为最后的手段. (7认同)
  • 除非作为最后的手段,否则我会觉得这样做不舒服:) (2认同)
  • 这是否假设您使用的是默认字体? (2认同)
  • 使用实例方法`CGRect textSize = [label textRectForBounds:CGRectMake(0,0,300,CGFLOAT_MAX)limitedToNumberOfLines:3]`,当前的文档似乎很好.注意:这不是@ AlexZak答案中的类方法.参考:https://developer.apple.com/library/ios/documentation/uikit/reference/UILabel_Class/Reference/UILabel.html#//apple_ref/occ/instm/UILabel/textRectForBounds:limitedToNumberOfLines: (2认同)

Ian*_*n L 7

你试过这个sizeWithFont: constrainedToSize: lineBreakMode:方法吗?

例如:

CGSize sizeToFit = [title sizeWithFont:label.font constrainedToSize:label.frame.size lineBreakMode:label.lineBreakMode];
Run Code Online (Sandbox Code Playgroud)