标题中包含两行文本的UIButton(numberOfLines = 2)


86

我正在尝试使UIButtontitleLabel中包含两行文本。这是我正在使用的代码:

    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的文本来保存文本并将其添加为按钮的子视图的唯一解决方案吗?



Viraj,是的,如果您设置numberOfLines=0并使用UILineBreakModeWordWrap,则可以获得多行。问题是如果文本太长,它可能会给出多于两行的内容。我希望在第二行的末尾两个省略号(如果文本太长)。
营销商

哦,那我想添加子视图可能是唯一的方法。
维拉伊

Answers:


87

更新答案以获取最新的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中,将Line BreakUIButton设置为Word Wrap。比起您可以插入多行标题。只需按一下Option + Return按键即可换行。您还需要将其添加到Interface Builder中的“用户定义的运行时”属性中:

titleLabel.textAlignment Number [1]

5
UILineBreakMode已弃用,请使用NSLineBreakMode代替
guillaume13年

2
从最新的iOS版本开始,这是不必要的。请参阅@sean的答案。
cbowns 2014年

146

您无需将UILabel添加到UIButton。那只是多余的对象和工作。

在按钮的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

6
这是2013年,到目前为止,这是最先进的解决方案。
克拉斯

@Blip不幸的是,您不需要在代码中进行操作。可能值得向Apple请求此功能提交错误报告。
bpapa 2015年

@bpapa是的,我同意,情节提要应该更加灵活。
2015年

6
这对我有用,但是它破坏了按钮的默认行为,该行为intrinsicContentSize仍返回仅与一行文本相对应的高度。我通过覆盖intrinsicContentSize将高度设置为的按钮的位置来修复了它[self.titleLabel sizeThatFits(CGSizeMake(self.titleLabel.frame.size.width, CGFLOAT_MAX)].height
Elise

@WillVonUllrich,因为您只能在接受的答案进行编辑时更改它。我将这些答案添加到了接受的答案中,这样可以帮助那些看起来比接受的答案更远的人。
Totumus Maximus

88

您可以轻松完成此操作,无需任何代码。在Interface Builder中,将Line BreakUIButton设置为Word Wrap。比起您可以插入多行标题。只需按一下Option + Return按键即可换行。您还需要将其添加到Interface Builder中的“用户定义的运行时”属性中:

titleLabel.textAlignment Number [1]

就这么简单。希望能帮助到你...


1
在简单情况下,此解决方案比当前接受的解决方案更好(更少的对象,代码)。
詹纳森·詹

1
您设置的属性与通过编程设置的属性完全相同,因此参数“较少的对象”无效。代码可能更少。但是它更具可读性。随您便;)
Totumus Maximus 2012年

哦,我想不清楚。感谢您尝试澄清。并不是很担心它是用IB vs Code完成的。这与以下事实有关:您无需在Borut的解决方案中添加其他标签,并且它也可以完成相同的操作。但是是的,两者都很好。:)
乔纳森·詹

要做这样的基本任务真的很麻烦。
CanPoyrazoğlu2013年

3
通过在Interface Builder中添加titleLabel.textAlignment 用户定义的运行时属性并将其设置为Number = 1(NSTextAlignmentCenter的值),可以实现100%无代码的相同目标。
0xced 2014年

21
 button.titleLabel.lineBreakMode = NSLineBreakByWordWrapping;

button.titleLabel.textAlignment = NSTextAlignmentCenter;

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

完美的一个!您不必拆开NSString内部setTitle。WordWrapping正在为您做这件事!
Alex Cio

对我来说,我必须在设置标题中拆分字符串。没有它,它就不起作用
user1960169'1

9

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

在“界面生成器” (或情节提要)中,将“换行”设置为“自动换行”。比起您可以插入多行标题。只需按 Option+Return键即可换行。

然后在“用户定义的运行时属性”中添加

密钥路径:titleLabel.textAlignment
类型:Number
值:1

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


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.