如何在UIButton上添加多行文本?

391

我有下面这段代码...

UILabel *buttonLabel = [[UILabel alloc] initWithFrame:targetButton.bounds];
buttonLabel.text = @"Long text string";
[targetButton addSubview:buttonLabel];
[targetButton bringSubviewToFront:buttonLabel];

我想实现按钮的多行文本,但按钮的backgroundImage始终遮挡文本。调用日志显示该UIButton的子视图中已添加了UILabel,但文本本身无法显示。这是UIButton的错误还是我的操作有误?


10
该代码的作用是设置按钮标题文本的行数为0,以便自动调整文本大小以适应按钮的大小。其中titleLabel是按钮的标题标签,?.表示如果此属性不为nil,则执行后面的代码,否则跳过该语句。 - ma11hew28
2
请注意,对于这个非常古老的 QA,在现代 Xcode 中非常简单,只需选择“属性文本”,然后就很容易了,选择“字符换行”。 - Fattie
还可以参考类似问题的更新答案 - ToolmakerSteve
请查看此答案(多行,适合宽度,适合高度)以获取按钮文本 https://dev59.com/l1wY5IYBdhLWcg3wgH3y#59211399 - Hamid Reza Ansari
iOS 15现在免费提供此功能 ⟹ https://developer.apple.com/videos/play/wwdc2021/10059/?time=641 - XLE_22
33个回答

0

添加按钮约束和子视图。这是我在我的项目中的做法,就像这样更容易。我几乎99%的时间都是以编程方式制作所有内容...因为对我来说更容易。故事板有时可能会非常有bug。


0
self.btnError.titleLabel?.lineBreakMode = NSLineBreakMode.byWordWrapping

self.btnError.titleLabel?.textAlignment = .center

self.btnError.setTitle("Title", for: .normal)

-4

虽然将子视图添加到控件中是可以的,但并不能保证它会正常工作,因为控件可能不希望它在那里,并且可能表现不佳。如果可以的话,只需将标签作为按钮的同级视图添加,并设置其框架以使其重叠在按钮上方;只要它被设置为出现在按钮的顶部,按钮无法遮挡它。

换句话说:

[button.superview addSubview:myLabel];
myLabel.center = button.center;

2
如果你提出这种丑陋的方法,请至少不要在代码示例中犯错误 :)。 如果它是子视图,标签不应该与按钮具有相同的中心。 使用myLabel.frame = button.bounds; 或 myLabel.center = cgPointMake(button.frame.size.with0.5,button.frame.size.height0.5)。 - JakubKnejzlik
2
@GrizzlyNetch 我特别建议不要将它添加为按钮的子视图。在这里使用addSubview:会将其添加到button的父视图中,从而使其成为按钮的同级元素,因此匹配它们的中心是正确的做法。 - Becca Royal-Gordon
啊,我的错误!你是对的,我错过了“小”的事实,它在父视图中:D...抱歉:) - JakubKnejzlik
虽然这不完全是所要求的,但这种解决方案是实现问题的一种糟糕方式,因为元素按钮有一个标题。 - Pablo Blanco
1
这是在 iPhone OS 2.0 中的合理建议。现在有更好的方法来做它。:^) - Becca Royal-Gordon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接