如何创建具有最大宽度的多行 UILabel?

Posted

技术标签:

【中文标题】如何创建具有最大宽度的多行 UILabel?【英文标题】:How to create a multi-line UILabel, with a maximum width? 【发布时间】:2012-12-28 20:31:34 【问题描述】:

我正在编写一个简单的 IRC 客户端,我正在按照 Twitter 的 ios 应用外观建模。我截取了 Twitter 应用的截图,供参考:

它看起来像一个简单的表格视图,每个单元格内都有一些标签。因此,在我的应用程序中,我正在以编程方式创建表格和单元格格式。我的自定义单元格中只有两个标签,我将它们放在另一个之上。顶部标签是一个简单的 1-liner。底部标签我想包含更长的消息,并且需要它在我指定的宽度内自动换行到多行。

我如何做到这一点?

到目前为止,我已经尝试将标签的框架显式设置为我想要的尺寸,但它不会自动换行,如果这就是我所做的一切。它只是水平流出单元格。然后,我尝试在 tableView:cellForRowAtIndexPath: 函数中为该标签调用 sizeToFit,但它似乎以非常小的宽度自动换行 - 文本在两个或三个字母之后换行,然后垂直流出单元格。

我似乎无法弄清楚如何让标签中的文本在指定宽度后换行。有什么想法吗?

我的自定义单元格类:https://github.com/ryancole/pound-client/blob/master/pound-client/views/MessageListCell.m

cellForRowAtIndexPath 函数:https://github.com/ryancole/pound-client/blob/master/pound-client/controllers/MessageListViewController.m#L62-L84

编辑 1:

为了演示当我将 numberOfLines 设置为 0 时发生了什么,对于无限,我附上了一个被调用的屏幕截图。它在几个字符之后换行,而不是首先占用 UILabel 框架的指定宽度。这是在调用 sizeToFit 之前设置的。

【问题讨论】:

【参考方案1】:

您需要将 numberOfLines 设置为您想要的行数,或者设置为 0 以允许行数不受限制(默认为 1)。您可能还需要将 lineBreakMode 设置为 NSLineBreakByWordWrapping(尽管这可能是默认设置)。

编辑后:如果您希望文本从顶部开始,那么我认为您必须使用可变高度的单元格,而不是为您的自定义单元格设置明确的大小。我在我的一个项目中就是这样做的:

-(CGFloat) tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 
    UILabel *label = [[UILabel alloc] init];
    label.numberOfLines = 0; // allows label to have as many lines as needed
    label.text = _objects[indexPath.row][@"detail2"];
    CGSize labelSize = [label.text sizeWithFont:label.font constrainedToSize:CGSizeMake(300, 300000) lineBreakMode:NSLineBreakByWordWrapping];
    CGFloat h = labelSize.height;
    return h + 50;

我这里创建的标签,只是为了计算行高,这个方法结束后就被丢弃了。单元格的宽度由我在 constrainedToSize: 参数中的 300 参数确定。 +50 只是我为了让我的细胞看起来正确而添加的一个软糖因素——你可能想弄乱这个数字来得到你想要的东西。在我的自定义单元格类中,我使用了 initWithStyle:reuseIdentifier,并且没有设置任何大小。

【讨论】:

我希望它可以根据需要占用尽可能多的行。我尝试将其设置为 0,以使其不受限制,但那是它以两三个字符包装的时候,并且没有占用整个指定的宽度。我将用一个说明这一点的屏幕截图更新我的原始帖子。 如果您正在这样做,请不要调用 sizeToFit。你不应该那样做。如果将 numberOfLines 设置为 0,它应该自动将单词换行到下一行,假设标签中有足够的垂直空间以允许额外的行。 @Ryan,尝试删除 cellForRowAtIndexPath: 方法中的 sizeToFit 行,看看是否有帮助。您在 init 方法中设置了明确的大小,所以我认为您不需要这些。 哦,好的,做到了!我只是将sizeToFit 与显式宽度相结合,现在回头看似乎是个坏主意。谢谢! 虽然我现在回想起我为什么使用sizeToFit - 我想在顶部垂直对齐标签内的文本。知道如何在没有 sizeToFit 的情况下做到这一点吗?

以上是关于如何创建具有最大宽度的多行 UILabel?的主要内容,如果未能解决你的问题,请参考以下文章

UItableviewcell中的多行UIlabel使用Autolayout

如何让 UILabel 更好地调整大小?

多行 UILabel 与固有内容大小的 UILabel 宽度相同

java,具有固定最大宽度的多行工具提示,使用 html 标签

如何限制 UILabel 的最大宽度?

如何像 UILabel 一样创建具有 intrinsicContentSize 的视图?