UILabel和numberOfLines和sizeToFit:

时间:2012-09-08 04:42:53

标签: ios5 uilabel text-size sizetofit

在iOS 5上。

我有一个最初放在笔尖中的UILabel元素。我希望x位置保持不变。我希望它采用1行或2行。如果超过两行,则应使用换行符设置来显示省略号。

我使用numberOfLines属性和-sizeToFit

如果我将UILabel的numberOfLines属性设置为0,它将正确地看到对于某些文本,没有足够的空间并在调用-sizeToFit之后将其包装到第二行但是在罕见的情况下如果线条长到足以拉伸到3行,我会得到三条线,这是我不想要的。如果我将numberOfLines属性设置为2,它实际上将整个事物拉伸到一条线上,并将我在笔尖中设置的初始框架拉长得更宽。

 CGRect titleFrame = [[self titleLabel] frame];
 [[self titleLabel] setNumberOfLines:0];
 [[self titleLabel] setText:newProductTitleText];
 [[self titleLabel] sizeToFit];
 CGRect newTitleFrame = [[self titleLabel] frame];

CGRect让我能够在事后计算出事物。因此将numberOfLines设置为0有效,并且不会更改框架中的原始origin.x,并且会将长文本分成多行,但不会将其约束为2行。将numberOfLines属性设置为2,当我阅读Apple文档时

  

此属性控制使用的最大行数,以便将标签的文本放入其边界矩形中。此属性的默认值为1.要删除任何最大限​​制,并根据需要使用尽可能多的行,请将此属性的值设置为0.

似乎我应该能够将其设置为两个并且仍然可以正常工作。我希望sizeToFit在展开以适应所有文本时以正X和Y方向展开,但当numberOfLines设置为0以外时,它会在负X方向上展开。

ETA:将“自动调整大小”的struts设置为上限和左侧以将其固定在最小x,y处。

感谢您的任何见解。

2 个答案:

答案 0 :(得分:0)

我有一个类似的问题,-[UILabel sizeToFit]不尊重我numberOfLines设置为2时设置的最大宽度。这就是我解决这个问题的方法:

    CGFloat titleMaxWidth = 200;
    CGFloat titleMinHeight = 30;
    CGFloat titleMaxHeight = 40;
    UILabel *titleLabel = [[UILabel alloc] initWithFrame:CGRectMake(10, 5, titleMaxWidth, titleMaxHeight)]; // alternatively, you could do this in a nib
    titleLabel.numberOfLines = 0;
    titleLabel.text = @"The title label will be sized appropriately with this technique.";
    titleLabel.font = [UIFont boldSystemFontOfSize:16];
    [titleLabel sizeToFit];
    titleLabel.numberOfLines = 2;
    if (titleLabel.height > titleMaxHeight)
    {
        titleLabel.height = titleMaxHeight;
    }
    else if (titleLabel.height < titleMinHeight)
    {
        titleLabel.height = titleMinHeight;
    }

正如您所看到的,我还希望标签的最小高度,因为-sizeToFit通常会使标签非常小,但如果您不关心最小高度,则可以忽略该代码。 titleMaxHeight的40“神奇数字”来自实验,并发现使用此字体的2行标签实际上只需要40px。在此代码中,-sizeToFit主要用于将文本保持在宽度内,并确定当我们有一个短文本字符串时是否可以减少40的初始高度。

答案 1 :(得分:0)

我使用了UIFont属性lineHeight:

CGFloat labelHeight = label.font.lineHeight*label.numberOfLines;