将UIButton字体大小调整为宽度

adi*_*dit 116 objective-c ios

我有以下代码:

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];
Run Code Online (Sandbox Code Playgroud)

问题是,当文本中的字符串不长时,它显示正常(1-2位数).但是,当它很长(3 ++数字)时,我只能看到一个红色按钮,里面没有文字.我该如何调整?

我不这么认为:

[button.titleLabel setAdjustsFontSizeToFitWidth:YES];
Run Code Online (Sandbox Code Playgroud)

这份工作,对吗?

eli*_*bud 282

试试这个:

button.titleLabel.numberOfLines = 1;
button.titleLabel.adjustsFontSizeToFitWidth = YES;
button.titleLabel.lineBreakMode = NSLineBreakByClipping; //<-- MAGIC LINE
Run Code Online (Sandbox Code Playgroud)

我不确定为什么这样做但它确实:)

  • @yunas将UILineBreakModeClip替换为NSLineBreakByClipping (8认同)

joa*_*kim 29

button.titleLabel.adjustsFontSizeToFitWidth = YES;
Run Code Online (Sandbox Code Playgroud)

如果您使用自动布局并且已对按钮的宽度设置了约束,则应自行完成工作.

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


Ale*_*kiy 13

EliBud的答案在iOS 8上不起作用.我找到了一个适用于iOS 8的解决方案.下面是一个快速的代码:

let label = self.button?.titleLabel
label?.minimumScaleFactor = 0.01
label?.adjustsFontSizeToFitWidth = true
label?.font = UIFont.systemFontOfSize(100)
Run Code Online (Sandbox Code Playgroud)

您可以使用标签?.lineBreakMode,因为我发现不同的休息模式的结果会有所不同.


tol*_*ard 10

在最新的快速,这似乎对我有用

button.titleLabel!.numberOfLines = 1
button.titleLabel!.adjustsFontSizeToFitWidth = true
button.titleLabel!.lineBreakMode = NSLineBreakMode.ByClipping
Run Code Online (Sandbox Code Playgroud)


kra*_*vil 8

adjustsFontSizeToFitWidth 在我在Interface Builder中的按钮上设置宽度约束之前,我没有为我工作.

设置约束使按钮的大小不变,因此没有意识到它必须缩小文本.


Pup*_*Pup 8

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

    button.titleLabel!.numberOfLines = 1
    button.titleLabel!.adjustsFontSizeToFitWidth = true
    button.titleLabel!.baselineAdjustment = .alignCenters
Run Code Online (Sandbox Code Playgroud)

还没人提到baselineAdjustment; 我需要它,因为按钮标签在adjustsFontSizeToFitWidth生效后变得垂直未对齐.Apple的baselineAdjustment文档:

如果adjustsFontSizeToFitWidth属性设置为true,则此属性控制在需要调整字体大小的情况下文本基线的行为.此属性的默认值为alignBaselines.仅当numberOfLines属性设置为时,此属性才有效1.


FWIW,我永远无法将标签完全对齐.


Nik*_*Kov 7

Swift 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 
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明