11

在 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:“Autosize”支柱设置为左上角以将其固定在最小 x,y 处。

感谢您的任何见解。

4

2 回答 2

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是否可以减小。

于 2013-03-15T17:36:34.730 回答
0

我使用了 UIFont 属性 lineHeight:

CGFloat labelHeight = label.font.lineHeight*label.numberOfLines;
于 2013-09-05T14:58:40.233 回答