将 UIButton 字体大小调整为宽度

我有以下密码:

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];

能完成任务,对吧?

81869 次浏览

试试这个:

button.titleLabel?.numberOfLines = 1
button.titleLabel?.adjustsFontSizeToFitWidth = true
button.titleLabel?.lineBreakMode = .byClipping //<-- MAGIC LINE

我不知道为什么这样做的把戏,但它做:)

EliBud 给出的答案在 iOS8上不起作用。 我找到了一个可以在 iOS8上运行的解决方案。 下面是一个快速代码:

let label = self.button?.titleLabel
label?.minimumScaleFactor = 0.01
label?.adjustsFontSizeToFitWidth = true
label?.font = UIFont.systemFontOfSize(100)

您可以使用 label? . lineBreakMode,因为我发现结果因不同的中断模式而异。

在我设置按钮的宽度限制之前,Interface Builder 不适合我。

设置约束可以防止按钮的大小增加,因此没有意识到它必须缩小文本。

button.titleLabel.adjustsFontSizeToFitWidth = YES;

应该做自己的 如果您正在使用自动布局的工作,并设置了一个约束按钮的宽度。

其他选项(最小比例因子,行数等)仍然可以用来进一步定制根据您的需要,但不是必需的。

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);

最后,我设置了字体大小,以确保在系统调整大小以适应之前,字体是“大”的。

在最近的迅速,这似乎为我工作

button.titleLabel!.numberOfLines = 1
button.titleLabel!.adjustsFontSizeToFitWidth = true
button.titleLabel!.lineBreakMode = NSLineBreakMode.ByClipping

基于其他答案的 iOS 10.3解决方案:

    button.titleLabel!.numberOfLines = 1
button.titleLabel!.adjustsFontSizeToFitWidth = true
button.titleLabel!.baselineAdjustment = .alignCenters

还没有人提到 baselineAdjustment; 我需要它,因为按钮标签在 adjustsFontSizeToFitWidth生效后会变得垂直不对齐。苹果的 baselineAdjustment文档:

如果将 adjustsFontSizeToFitWidth属性设置为 true,则此 属性控制文本基线在某些情况下的行为 其中需要调整字体大小。默认值为 此属性为 alignBaselines。此属性仅在以下情况下有效 numberOfLines属性设置为 1


FWIW,我从来没有得到标签完全对齐。

斯威夫特4号分机

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
}
}
}

enter image description here

基于尼克 · 科夫的回答:

import UIKit




extension UIButton {
@IBInspectable var adjustFontSizeToWidth: Bool {
get {
return titleLabel!.adjustsFontSizeToFitWidth
}
set {
titleLabel!.adjustsFontSizeToFitWidth = newValue
titleLabel!.lineBreakMode             = .byClipping
}
}
}

下面的解决方案对我很有效:

button.titleLabel?.adjustsFontForContentSizeCategory = true

开发人员文档将此属性解释为:

一个布尔值,指示对象是否自动更新 当设备的内容大小类别更改时,它的字体。

在 iOS13.1和 Swift 5中,我必须提供 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)
}
}
}

如果没有其他答案有帮助,确保您设置默认的故事板样式值,然后 adjustsFontSizeToFitWidth应该工作。

buttons props