UILabel的sizeToFit / sizeThatFits忽略numberoflines属性

时间:2011-02-18 13:30:47

标签: iphone cocoa-touch

问题:假设宽度为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像素,UI显示一条带有剪切文本的行。我希望宽度为300像素,两条线的高度为44像素。

数字线的UILabel文档说:

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

我尝试了各种组合:

  1. CGRectZero传递给init函数,传递300x400或300 x无穷大。
  2. 创建后设置框架,而不是将其传递给init函数。
  3. 调用[sizeToFit]并希望它计算假设当前宽度的高度,但事实并非如此。
  4. 调用sizeToFit然后调用sizeThatFits`。
  5. 调用layoutIfNeeded
  6. 它们都不起作用。我做错了什么,或者这是文档和框架实现不一致的错误?感谢。

6 个答案:

答案 0 :(得分:22)

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

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

像魅力一样......:)

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

答案 1 :(得分:7)

您是否尝试过sizeWithFont: constrainedToSize: lineBreakMode:方法?

例如:

CGSize sizeToFit = [title sizeWithFont:label.font constrainedToSize:label.frame.size lineBreakMode:label.lineBreakMode];

答案 2 :(得分:3)

我发现Ian L'使用-sizeWithFont:constrainedToSize:lineBreakMode:的答案最好,遗憾的是sizeWithFont:在iOS7下已被弃用。

这就是sizeWithFont:在iOS7中为UILabel子类工作的方式:

NSRange range = NSMakeRange(0, self.attributedText.length); 
sizeToFit = [self.text boundingRectWithSize:self.bounds.size
                                    options:NSStringDrawingUsesLineFragmentOrigin 
                                 attributes:[self.attributedText 
                          attributesAtIndex:0 effectiveRange:&range] context:nil].size;

答案 3 :(得分:1)

sizeToFit的ios5没有解决方案。您可以使用其他解决方案,例如sizeWithFont等。在ios6中,问题已修复。但是,我的解决方案有这个解决方法:

int lineCount = myLabel.numberOfLines;
myLabel.numberOfLines = 0;
[myLabel sizeToFit];
myLabel.numberOfLines = lineCount;

它有效。请注意,对于我的情况,我的标签宽度是固定的,我只需要sizeToFit来调整高度。

答案 4 :(得分:1)

已全部弃用。使用boundingRectWithSize

答案 5 :(得分:0)

我认为你得到了意想不到的结果,因为你没有考虑UILabel的字体。请尝试以下方法:

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 = 0;

CGSize size = [label.text sizeWithFont:label.font constrainedToSize:CGSizeMake(label.frame.size.width,FLT_MAX) lineBreakMode:UILineBreakModeWordWrap ];
label.frame = CGRectMake(label.frame.origin.x,label.frame.origin.y,label.frame.size.width,size.height);