UIButton标题中有两行文字(numberOfLines = 2)

时间:2011-10-20 06:27:06

标签: objective-c ios uibutton uilabel

我正在尝试在其titleLabel中创建一个包含两行文本的UIButton。这是我正在使用的代码:

    UIButton *titleButton = [[UIButton alloc] initWithFrame:CGRectMake(15, 10, frame.size.width-100, 100)];
    titleButton.titleLabel.font = [UIFont boldSystemFontOfSize:24.0];
    [titleButton setTitle:@"This text is very long and should get truncated at the end of the second line" forState:UIControlStateNormal];
    titleButton.titleLabel.lineBreakMode = UILineBreakModeTailTruncation;
    titleButton.titleLabel.numberOfLines = 2;
    [self addSubview:titleButton];

当我尝试这个时,文本只出现在一行上。似乎在UIButton.titleLabel中实现多行文字的唯一方法是设置numberOfLines=0并使用UILineBreakModeWordWrap。但这并不能保证文本正好是两行。

然而,使用普通UILabel确实有效:

    UILabel *titleLabel = [[UILabel alloc] initWithFrame:CGRectMake(15, 10, frame.size.width-100, 100)];
    titleLabel.font = [UIFont boldSystemFontOfSize:24.0];
    titleLabel.text = @"This text is very long and should get truncated at the end of the second line";
    titleLabel.numberOfLines = 2;
    titleLabel.lineBreakMode = UILineBreakModeTailTruncation;
    [self addSubview:titleLabel];

有谁知道如何让UIButton使用两行?唯一的解决方案是创建一个单独的UILabel来保存文本,并将其添加为按钮的子视图吗?

6 个答案:

答案 0 :(得分:145)

您无需向UIButton添加UILabel。这只是额外的对象和工作。

在按钮的titleLabel上设置这些属性。

button.titleLabel.lineBreakMode = NSLineBreakByWordWrapping;
button.titleLabel.numberOfLines = 2;//if you want unlimited number of lines put 0

夫特:

button.titleLabel!.lineBreakMode = NSLineBreakMode.ByWordWrapping
button.titleLabel!.numberOfLines = 2//if you want unlimited number of lines put 0

答案 1 :(得分:86)

您可以更轻松地完成此操作,无需任何代码。在Interface Builder中,将UIButton上的Line Break设置为Word Wrap。比你可以插入多行标题。只需按Option + Return键即可创建新行。 您还需要将其添加到Interface Builder中的用户定义的运行时属性:

titleLabel.textAlignment Number [1]

就这么简单。希望它有所帮助...

答案 2 :(得分:73)

更新了近期iOS版本的答案

由于这是公认的答案,所以在这里添加了@Sean的答案:

在按钮的titleLabel上设置这些属性。

button.titleLabel.lineBreakMode = NSLineBreakByWordWrapping;
button.titleLabel.numberOfLines = 2; // if you want unlimited number of lines put 0

Swift 3和4:

button.titleLabel?.lineBreakMode = .byWordWrapping
button.titleLabel?.numberOfLines = 2 // if you want unlimited number of lines put 0

旧版iOS的原始答案

如果您想在UIButton之上添加两行文字,则应在其上添加一个UIlabel,这样做就可以了。

UILabel *titleLabel = [[UILabel alloc] initWithFrame:CGRectMake(15, 10, frame.size.width-100, 100)];
titleLabel.font = [UIFont boldSystemFontOfSize:24.0];
titleLabel.text = @"This text is very long and should get truncated at the end of the second line";
titleLabel.numberOfLines = 2;
titleLabel.lineBreakMode = UILineBreakModeTailTruncation;
[myButton addSubview:titleLabel]; //add label to button instead.

已更新界面构建器解决方案

添加@Borut Tomazin的答案以获得更完整的答案。 自从@Borut Tomazin的答案得到改善后,我再次更新了这一部分。

您可以更轻松地完成此操作,无需任何代码。在Interface Builder中,将UIButton上的Line Break设置为Word Wrap。比你可以插入多行标题。只需按Option + Return键即可创建新行。您还需要将其添加到Interface Builder中的用户定义的运行时属性:

titleLabel.textAlignment Number [1]

答案 3 :(得分:19)

 button.titleLabel.lineBreakMode = NSLineBreakByWordWrapping;

button.titleLabel.textAlignment = NSTextAlignmentCenter;

[button setTitle: @"Line1\nLine2" forState: UIControlStateNormal];

答案 4 :(得分:9)

为避免完全需要编辑代码,因此需要对视图进行子类化,在Xcode5及更高版本中,您可以遵循Borut Tomazin的建议:

  

在Interface Builder (或故事板)中设置换行符   自动换行。比你可以插入多行标题。刚打   选项 + 返回键以换行。

然后,在用户定义的运行时属性中,您可以添加

关键路径:titleLabel.textAlignment
输入:Number
价值:1

注意:这可能不是完全“未来证明”,因为我们正在将UITextAlignmentCenter常量转换为其数值(并且该常量可能会随着新iOS版本的发布而改变),但它似乎是安全的在不久的将来。

答案 5 :(得分:0)

您可以直接从Storyboard修改所需的值。 选择按钮,转到身份检查器并在“用户定义的运行时属性”部分中添加以下键值对:

enter image description here