如何创建一个最大宽度的多行UILabel?

Rya*_*yan 1 cocoa-touch uitableview uilabel ios

我正在编写一个简单的IRC客户端,我正在Twitter推出iOS应用程序之后进行建模.我已经截取了Twitter应用程序的截图,供参考:

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

我该如何实现这一目标?

到目前为止,我已经尝试将标签的框架明确地设置为我想要的尺寸,但是如果我这样做的话,它就不会自动换行.它只是水平地流出细胞.然后sizeToFit,我尝试在tableView:cellForRowAtIndexPath:函数内调用此标签,但它似乎以非常小的宽度进行自动换行 - 文本包裹在两个或三个字母之后,然后垂直流出单元格.

我似乎无法弄清楚如何使标签内的文本在指定的宽度后换行.有任何想法吗?

我的自定义单元类: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.

rde*_*mar 6

您需要将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;
}
Run Code Online (Sandbox Code Playgroud)

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

  • @Ryan,尝试删除cellForRowAtIndexPath:方法中的sizeToFit行,看看是否有帮助.你在init方法中设置了一个显式大小,所以我认为你不需要那些. (2认同)