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

Posted

技术标签:

【中文标题】标题中有两行文本的 UIButton (numberOfLines=2)【英文标题】:UIButton with two lines of text in the title (numberOfLines=2) 【发布时间】:2011-12-11 12:40:41 【问题描述】:

我正在尝试制作一个UIButton,它的titleLabel 中有两行文本。这是我正在使用的代码:

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 来保存文本,并将其添加为按钮的子视图?

【问题讨论】:

你见过这个吗? - ***.com/questions/604632/… Viraj,是的,如果您设置numberOfLines=0 并使用UILineBreakModeWordWrap,您可以获得多行。这样做的问题是,如果文本太长,它可能会给出两行以上。我想要正好在第二行末尾带有省略号的两个单独的字符(如果文本太长)。 哦,那我想添加子视图可能是唯一的方法了。 【参考方案1】:

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

【讨论】:

【参考方案2】:

更新了最新 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 顶部添加 2 行文本,您应该在其顶部添加一个 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]

【讨论】:

UILineBreakMode 已弃用,请使用 NSLineBreakMode 代替它 这在最近的 ios 版本中是不必要的。请参阅@sean 的回答。【参考方案3】:

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

titleLabel.textAlignment Number [1]

就这么简单。希望对你有帮助...

【讨论】:

对于简单的情况,此解决方案比当前接受的解决方案更好(更少的对象、代码)。 您设置的属性与以编程方式设置的属性完全相同,因此您的参数“更少对象”无效。代码可能更少。但它更具可读性。任你选;) 哦,我想我不清楚。感谢您试图澄清。并不太关心它是在 IB vs Code 中完成的。更多的原因是您不需要在 Borut 的解决方案中添加额外的标签,并且它也完成了同样的事情。但是,是的,两者都很好用。 :) 对于这样一项基本任务,需要在后台编写代码真的让人不知所措。 您可以通过在 Interface Builder 中添加 titleLabel.textAlignment User Defined Runtime Attribute 并将其设置为 Number = 来实现 100% 无代码的相同目标1(NSTextAlignmentCenter 的值)。【参考方案4】:

您不需要向 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

【讨论】:

这是 2013 年的,截至今天,这是最先进的解决方案。 @Blip 不幸的是,您不能这样做,需要在代码中完成。可能值得向 Apple 提交请求此功能的错误报告。 @bpapa 是的,我同意,故事板应该更灵活。 这对我有用,但是它破坏了按钮intrinsicContentSize 的默认行为,它仍然返回仅对应于一行文本的高度。我通过覆盖按钮的intrinsicContentSize 来修复它,我将高度设置为[self.titleLabel sizeThatFits(CGSizeMake(self.titleLabel.frame.size.width, CGFLOAT_MAX)].height @WillVonUllrich 因为您只能在编辑时更改接受的答案。我将这些答案添加到已接受的答案中,这样它会帮助那些没有进一步了解接受答案的人。【参考方案5】:

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

在 Interface Builder (或故事板) 中将换行符设置为 自动换行。比你可以插入多行标题。刚打 Option + Return 键换行。

然后,在 User Defined Runtime Attributes 中可以添加

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

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

【讨论】:

【参考方案6】:
 button.titleLabel.lineBreakMode = NSLineBreakByWordWrapping;

button.titleLabel.textAlignment = NSTextAlignmentCenter;

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

【讨论】:

完美的一个!您不必在setTitle 中拆分NSString。 `WordWrapping` 正在为你做这个! 对我来说,我必须在集合标题内拆分字符串。没有它就行不通

以上是关于标题中有两行文本的 UIButton (numberOfLines=2)的主要内容,如果未能解决你的问题,请参考以下文章

2 行文本 UIButton

使用 CSS 调整换行文本的大小 [重复]

在Objective c中两行文本的末尾添加一个链接/ UI按钮

UIButton 不同字体大小的标题和副标题

如何创建带有两行文本且第一行文本大于第二行的 UIButton?

How-to:绘制换行文本的两种方法