如何将多行文本添加到UIButton?

Owa*_*unt 358 cocoa-touch uibutton uikit ios

我有以下代码......

UILabel *buttonLabel = [[UILabel alloc] initWithFrame:targetButton.bounds];
buttonLabel.text = @"Long text string";
[targetButton addSubview:buttonLabel];
[targetButton bringSubviewToFront:buttonLabel];
Run Code Online (Sandbox Code Playgroud)

...我的想法是我可以为按钮添加多行文本,但文本总是被UIButton的backgroundImage遮盖.用于显示按钮子视图的日志记录调用显示已添加UILabel,但无法看到文本本身.这是UIButton中的错误还是我做错了什么?

jes*_*rry 664

对于iOS 6及更高版本,请使用以下内容以允许多行:

button.titleLabel.lineBreakMode = NSLineBreakByWordWrapping;
// you probably want to center it
button.titleLabel.textAlignment = NSTextAlignmentCenter; // if you want to 
[button setTitle: @"Line1\nLine2" forState: UIControlStateNormal];
Run Code Online (Sandbox Code Playgroud)

对于iOS 5及更低版本,请使用以下内容以允许多行:

button.titleLabel.lineBreakMode = UILineBreakModeWordWrap;
// you probably want to center it
button.titleLabel.textAlignment = UITextAlignmentCenter;
[button setTitle: @"Line1\nLine2" forState: UIControlStateNormal];
Run Code Online (Sandbox Code Playgroud)

2017年,iOS9前锋,

通常,只做这两件事:

  1. 选择"归属文本"
  2. 在"Line Break"弹出窗口中选择"Word Wrap"

  • 实际上,只需添加button.titleLabel.numberOfLines = 0; 这将使线条无限制.并且button.titleLabel.textAlignment = NSTextAlignmentLeft; 如果您想要左对齐文本,则默认情况下标题居中. (28认同)
  • 请注意,这些作业在iOS 6中已弃用.请参阅@NiKKi下面的答案以获取更新的语法. (5认同)
  • 只是让人们知道:如果您使用NSAttributedString,这不起作用 (4认同)
  • 在swift`button.titleLabel?.lineBreakMode = NSLineBreakMode.ByWordWrapping` (4认同)
  • 请注意,如果您想使用自动布局,“UIButton”有一个错误,该错误会阻止内部内容大小与边缘插入一起正常工作。要解决这个问题,请参阅http://stackoverflow.com/questions/17800288/autolayout-intrinsic-size-of-uibutton-does-not-include-title-insets,其中提供了一个很好的解决方案。 (2认同)

Ada*_*ite 140

所选答案是正确的但如果您更喜欢在Interface Builder中执行此类操作,则可以执行以下操作:

PIC

  • 感谢我24岁的自己写这个答案,来自28岁的自我. (47认同)
  • 为了只使用Interface Builder,必须在“用户定义的运行时属性”中将“ Number”值的“ titleLabel.textAlignment”设置为“ 1”,以使文本居中 (4认同)
  • 感谢你从我 24 岁的自己变成了 28 岁的自己! (3认同)

小智 55

如果要添加标题以多行为中心的按钮,请为按钮设置Interface Builder的设置:

[这里]

  • 实际上,这是这个帖子中最好的答案.立即工作,并显示来自IB的居中文本.谢谢! (2认同)

NiK*_*KKi 53

对于IOS 6:

button.titleLabel.lineBreakMode = NSLineBreakByWordWrapping;
button.titleLabel.textAlignment = NSTextAlignmentCenter;
Run Code Online (Sandbox Code Playgroud)

UILineBreakModeWordWrap and UITextAlignmentCenter
Run Code Online (Sandbox Code Playgroud)

在IOS 6开始时已弃用..


bau*_*dot 30

重申Roger Nolan的建议,但使用明确的代码,这是一般解决方案:

button.titleLabel?.numberOfLines = 0
Run Code Online (Sandbox Code Playgroud)


Md.*_*san 21

SWIFT 3

button.titleLabel?.lineBreakMode = .byWordWrapping
button.titleLabel?.textAlignment = .center  
button.setTitle("Button\nTitle",for: .normal)
Run Code Online (Sandbox Code Playgroud)


Ami*_*ndi 12

我遇到了自动布局的问题,启用多行后,结果是这样的:
在此处输入图片说明
因此titleLabel大小不会影响按钮的大小
我添加Constraints基于contentEdgeInsets(在这种情况下contentEdgeInsets为(10,10,10,10)
之后调用makeMultiLineSupport()
在此处输入图片说明
希望它对你有帮助(swift 5.0):

extension UIButton {

    func makeMultiLineSupport() {
        guard let titleLabel = titleLabel else {
            return
        }
        titleLabel.numberOfLines = 0
        titleLabel.setContentHuggingPriority(.required, for: .vertical)
        titleLabel.setContentHuggingPriority(.required, for: .horizontal)
        addConstraints([
            .init(item: titleLabel,
                  attribute: .top,
                  relatedBy: .greaterThanOrEqual,
                  toItem: self,
                  attribute: .top,
                  multiplier: 1.0,
                  constant: contentEdgeInsets.top),
            .init(item: titleLabel,
                  attribute: .bottom,
                  relatedBy: .greaterThanOrEqual,
                  toItem: self,
                  attribute: .bottom,
                  multiplier: 1.0,
                  constant: contentEdgeInsets.bottom),
            .init(item: titleLabel,
                  attribute: .left,
                  relatedBy: .greaterThanOrEqual,
                  toItem: self,
                  attribute: .left,
                  multiplier: 1.0,
                  constant: contentEdgeInsets.left),
            .init(item: titleLabel,
                  attribute: .right,
                  relatedBy: .greaterThanOrEqual,
                  toItem: self,
                  attribute: .right,
                  multiplier: 1.0,
                  constant: contentEdgeInsets.right)
            ])
    }

}
Run Code Online (Sandbox Code Playgroud)

  • 正如所写,这些约束每次都会导致自动布局冲突。虽然我还不能 100% 确定使用不等式约束的重要性,但我确实知道其中 2 个约束写得不正确:底部和右边缘应该使用 `latedBy: .lessThanOrEqual` 并翻转常量负值 `constant : -contentEdgeInsets.{底部|右侧}` (2认同)

Val*_*ora 11

有一个更简单的方法:

someButton.lineBreakMode = UILineBreakModeWordWrap;
Run Code Online (Sandbox Code Playgroud)

(针对iOS 3及更高版本编辑:)

someButton.titleLabel.lineBreakMode = UILineBreakModeWordWrap;
Run Code Online (Sandbox Code Playgroud)

  • UIButton.lineBreakMode在3.0中已弃用,因此不再是一个不错的选择. (4认同)
  • 不建议将lineBreakMode用作UIButton的直接属性。我们被定向为“改为使用titleLabel的lineBreakMode属性。” 我相应地编辑了Valerii的答案。仍然是一个不错的选择。 (2认同)

neo*_*eye 11

使用autolayout在iOS7上左对齐:

button.titleLabel.lineBreakMode = NSLineBreakByWordWrapping;
button.titleLabel.textAlignment = NSTextAlignmentLeft;
button.contentHorizontalAlignment = UIControlContentHorizontalAlignmentLeft;
Run Code Online (Sandbox Code Playgroud)


Naz*_*lam 9

在Xcode 9.3中,你可以使用如下的故事板,

在此输入图像描述

您需要将按钮标题textAlignment设置为居中

button.titleLabel?.textAlignment = .center

您不需要使用新行(\n)设置标题文本,如下所示,

button.setTitle("Good\nAnswer",for: .normal)

只需设置标题,

button.setTitle("Good Answer",for: .normal)

这是结果,

在此输入图像描述


Rog*_*Rog 7

首先,你应该知道UIButton里面已经有了UILabel.您可以使用它进行设置–setTitle:forState:.

您的示例的问题是您需要将UILabel的numberOfLines属性设置为默认值1以外的值.您还应该查看lineBreakMode属性.


Man*_*dan 6

Swift 5,用于 UIButton 中的多行文本

  let button = UIButton()
  button.titleLabel?.lineBreakMode = .byWordWrapping
  button.titleLabel?.textAlignment = .center
  button.titleLabel?.numberOfLines = 0 // for Multi line text
Run Code Online (Sandbox Code Playgroud)


Bil*_*han 6

要固定标题标签与按钮的间距,请在 setTitle之前设置 titleEdgeInsets 和其他属性:

    let button = UIButton()
    button.titleLabel?.lineBreakMode = .byWordWrapping
    button.titleLabel?.numberOfLines = 0
    button.titleEdgeInsets = UIEdgeInsets(top: 10, left: 10, bottom: 20, right: 20)
    button.setTitle("Dummy button with long long long long long long long long title", for: .normal)
Run Code Online (Sandbox Code Playgroud)

PS 我测试过设置 titleLabel?.textAlignment 是不必要的,标题在.natural.