我有以下代码:
UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
button.frame = CGRectMake(0.0, 0.0, 25, 25);
[[button layer] setCornerRadius:5.0f];
[[button layer] setMasksToBounds:YES];
[[button layer] setBackgroundColor:[[UIColor redColor] CGColor]];
[button.titleLabel setFrame:CGRectMake(0,0, 25, 25)];
[button setTitle:[NSString stringWithFormat:@"%@", [[topics objectAtIndex:indexPath.row] unread]] forState:UIControlStateNormal];
问题是当文本中的字符串不长时,它显示正常(1-2位)。但是,当它很长(3 ++数字)时,我只能看到一个红色按钮,里面没有文字。我该如何调整呢?
我不这么认为:
[button.titleLabel setAdjustsFontSizeToFitWidth:YES];
完成这项工作,对吧?
答案 0 :(得分:267)
试试这个:
button.titleLabel.numberOfLines = 1;
button.titleLabel.adjustsFontSizeToFitWidth = YES;
button.titleLabel.lineBreakMode = NSLineBreakByClipping; //<-- MAGIC LINE
我不确定为什么会这样做,但确实如此:)
答案 1 :(得分:27)
button.titleLabel.adjustsFontSizeToFitWidth = YES;
如果您使用自动布局,应自行完成,并在按钮的宽度上设置约束。
其他选项(最小比例因子,行数等)仍可用于根据您的需要进一步定制,但不是必需的。
答案 2 :(得分:13)
EliBud的答案在iOS 8上不起作用。 我找到了适用于iOS 8的解决方案。 下面是一个快速的代码:
let label = self.button?.titleLabel
label?.minimumScaleFactor = 0.01
label?.adjustsFontSizeToFitWidth = true
label?.font = UIFont.systemFontOfSize(100)
您可以使用标签?.lineBreakMode,因为我发现不同的休息模式的结果会有所不同。
答案 3 :(得分:8)
在最新的swift中,这似乎对我有用
button.titleLabel!.numberOfLines = 1
button.titleLabel!.adjustsFontSizeToFitWidth = true
button.titleLabel!.lineBreakMode = NSLineBreakMode.ByClipping
答案 4 :(得分:6)
iOS 10.3解决方案基于其他答案:
button.titleLabel!.numberOfLines = 1
button.titleLabel!.adjustsFontSizeToFitWidth = true
button.titleLabel!.baselineAdjustment = .alignCenters
还没有人提到baselineAdjustment
;我需要它,因为在adjustsFontSizeToFitWidth
生效后按钮标签会垂直错位。 Apple的baselineAdjustment
文档:
如果
adjustsFontSizeToFitWidth
属性设置为true
,则为此 property控制情境中文本基线的行为 需要调整字体大小的地方。默认值为 此属性为alignBaselines
。此属性仅在有效时才有效numberOfLines
属性设置为1
。
FWIW,我永远无法将标签完全对齐。
答案 5 :(得分:3)
Xamarin.iOS解决方案
var accountButton = new UIButton();
accountButton.SetTitle("Account", UIControlState.Normal);
accountButton.TitleLabel.AdjustsFontSizeToFitWidth = true;
accountButton.TitleLabel.Lines = 1;
accountButton.TitleLabel.LineBreakMode = UILineBreakMode.Clip;
accountButton.TitleLabel.Font = accountButton.TitleLabel.Font.WithSize(35);
我最终设置了字体大小以确保字体是&#34;大&#34;在系统调整大小以适应之前。
答案 6 :(得分:3)
extension UIButton {
@IBInspectable var adjustFontSizeToWidth: Bool {
get {
return self.titleLabel?.adjustsFontSizeToFitWidth
}
set {
self.titleLabel?.numberOfLines = 1
self.titleLabel?.adjustsFontSizeToFitWidth = newValue;
self.titleLabel?.lineBreakMode = .byClipping;
self.titleLabel?.baselineAdjustment = .alignCenters
}
}
}
答案 7 :(得分:2)
基于Nik Kov的答案:
import UIKit
extension UIButton {
@IBInspectable var adjustFontSizeToWidth: Bool {
get {
return titleLabel!.adjustsFontSizeToFitWidth
}
set {
titleLabel!.adjustsFontSizeToFitWidth = newValue
titleLabel!.lineBreakMode = .byClipping
}
}
}
答案 8 :(得分:0)
以下解决方案对我有用:
button.titleLabel?.adjustsFontForContentSizeCategory = true
开发者文档将此属性解释为:
一个布尔值,指示对象是否自动更新 设备的内容大小类别更改时的字体。
答案 9 :(得分:0)
在带有Swift 5的iOS 13.1中,我还必须提供contentEdgeInsets
来调整填充。
extension UIButton {
@IBInspectable var adjustFontSizeToWidth: Bool {
get {
return self.titleLabel?.adjustsFontSizeToFitWidth ?? false
}
set {
self.titleLabel?.numberOfLines = 1
self.titleLabel?.adjustsFontSizeToFitWidth = newValue;
self.titleLabel?.lineBreakMode = .byClipping;
self.titleLabel?.baselineAdjustment = .alignCenters
self.contentEdgeInsets = UIEdgeInsets(top: 10, left: 10, bottom: 10, right: 10)
}
}
}