This question already has answers here:
Vertically align text to top within a UILabel

(49个答案)


6年前关闭。





在iOS 5上。

我有一个UILabel元素,它最初放置在笔尖中。我希望x位置保持固定。我希望它采用1行或2行。如果多于两行,则应使用换行设置显示省略号。

我使用numberOfLines属性和-sizeToFit

如果将UILabel的numberOfLines属性设置为0,它将正确看到某些文本没有足够的空间,并在调用-sizeToFit之后将其包装到第二行,但在极少数情况下,该行足够长延伸到三行,我得到三行,这是我不想要的。如果将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方向上扩展。

预计到达时间:将“自动调整大小”撑杆设置为上下,以将其固定为最小x,y。

感谢您的任何见解。

最佳答案

我遇到了类似的问题,其中-[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的初始高度。

08-05 23:45