我有一个内置于Interface Builder的UIButton,它有一个默认标签。在Xcode中,我正在动态更改标签文本:
myButton.titleLabel.text = @"this is the new label";
但是,当文本更新时,新字符串将被剪切为与原始字符串相同的大小,最终看起来像:
this...label
任何人都知道为什么会这样吗?
你应该使用setTitle:forState:来改变UIButton
的标题。如果你自己更改标题,按钮没有任何迹象表明它需要调整标签大小 - 你最终必须做这样的事情:
myButton.titleLabel.text = @"this is the new label";
[myButton setNeedsLayout];
但我甚至不确定它会在所有情况下都有效。提供了像setTitle:forState:
这样的方法,这样您就可以为多个状态提供标题而无需手动更新按钮,并且按钮知道它需要使用新标题进行布局。
尝试使用按钮的setTitle方法(而不是直接在标签上设置标题)。它应该强制标题标签的大小调整。
目标C:
[myButton setTitle:@"This is the text" forState:UIControlStateNormal];
或者在Swift中:
myButton.setTitle("This is the text", for: .normal)
另一种解决方案是让UIButton的内部UILabel缩小字体大小,因为UILabels可以这样做:
button.titlelabel.minimumFontSize = 8.0; // or some more adequate size
self.buttonWithLongTitle.titleLabel.adjustsFontSizeToFitWidth = YES;
在你的按钮上调用sizeToFit
。这将调整按钮的大小以适合文本。
如果这不起作用,您可以始终确定字符串大小并调整按钮框架宽度。在这种情况下,你确定它适合。
// Calculate the size
CGSize buttonSize = [@"My text.." sizeWithFont:[UIFont systemFontOfSize:15.0]
constrainedToSize:someSize lineBreakMode:UILineBreakModeWordWrap];
// Do whatever you want with the "buttonSize", you can for example adjust your button's frame width
Swift 4.2中的解决方案
yourButton.titleLabel?.minimumScaleFactor = 0.5 //set whatever you want here to scale
yourButton.titleLabel?.adjustsFontSizeToFitWidth = true