UILabel、numberOfLines和sizeToFit的使用方法:

12

在iOS 5中,我有一个UILabel元素最初放置在nib中。我想让它的x坐标保持不变。我希望它可以只占用1行或2行。如果超过两行,它应该使用换行设置来显示省略号。

我使用numberOfLines属性和-sizeToFit方法。

如果我将UILabel的numberOfLines属性设置为0,然后调用-sizeToFit方法,它会正确地将某些文本分成两行以适应空间。但是,在很少的情况下,当一行足够长以延伸到3行时,我得到了三行,这是我不想要的。如果我将numberOfLines属性设置为2,它实际上把整个内容都拉伸到一行并使我的初始框架比nib中设置的宽得多。

 CGRect titleFrame = [[self titleLabel] frame];
 [[self titleLabel] setNumberOfLines:0];
 [[self titleLabel] setText:newProductTitleText];
 [[self titleLabel] sizeToFit];
 CGRect newTitleFrame = [[self titleLabel] frame];
CGRect只是用来在事后进行计算的。将numberOfLines设置为0可以使长文本自动换行,但不会更改frame的原始origin.x,并且不会限制文本只能显示在2行中。将numberOfLines属性设置为2时,它控制最多允许文本占用的行数,但仍然可以正常工作。当使用numberOfLines除0以外的其他值时,sizeToFit扩展时会向负X方向扩展,而不是向正X、Y方向扩展。注:已经将“Autosize” struts设置为上部和左部以将其固定在最小x,y处。感谢任何洞见。

我认为这个线程可能有所帮助 https://dev59.com/D2445IYBdhLWcg3wGWd7#13786846 - Gia Dang
2
这是一个老问题,可能与当前的iOS无关,但我不明白它为什么会被认为是重复的。我阅读了被认为是重复的那个问题,但它是一个不同的问题。这个问题询问的是-sizeToFit设置负X而不是在UILabel中垂直对齐文本的问题。 - chadbag
2个回答

0

我使用了UIFont属性lineHeight:

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

0
我曾经遇到过类似的问题,当numberOfLines设置为2时,-[UILabel sizeToFit]没有遵守我设置的最大宽度。以下是我解决这个问题的方法:
    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 来自实验和发现,使用此字体的两行标签实际上只需要 40 像素。在此代码中,-sizeToFit 主要用于保持文本在宽度内,并确定当我们有短字符串文本时是否可以减少初始高度为 40。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接