将 UIButton 字体大小调整为宽度

Posted

技术标签:

【中文标题】将 UIButton 字体大小调整为宽度【英文标题】:Adjust UIButton font size to width 【发布时间】:2011-05-30 16:16:02 【问题描述】:

我有以下代码:

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

工作,对吧?

【问题讨论】:

它应该可以工作,或者Label.adjustsFontSizeToFitWidth = YES。 它由titleButton.setContentCompressionResistancePriority(.defaultLow, for: .horizontal)工作 【参考方案1】:

试试这个:

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

我不知道为什么会这样,但确实如此:)

【讨论】:

谢谢,而 button.titleLabel.lineBreakMode = UILineBreakModeClip; @yunas 将 UILineBreakModeClip 替换为 NSLineBreakByClipping Nvm,刚刚把numberOfLines改成了0【参考方案2】:
button.titleLabel.adjustsFontSizeToFitWidth = YES;

如果您使用自动布局并已对按钮的宽度设置了限制,则应自行完成。

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

【讨论】:

【参考方案3】:

EliBud 的回答不适用于 ios 8。 我找到了一个适用于 iOS 8 的解决方案。 以下是快速代码:

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

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

【讨论】:

.adjustsFontSizeToFitWidth = true - 我怎样才能对 NSTextField 和可调整大小的窗口做同样的事情? 在我看来,这与使用 Xcode IB 选择标签并将其设置为 Autoshrink minimum font scale to 0.01 相同 使用 NSTextField 时没有 AutoShrink 选项 UITextField 有一个自动缩小文本的选项,而 NSTextField 没有。所以我认为你需要手动调整字体以适应文本字段的宽度。【参考方案4】:

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 
        
    

【讨论】:

你用标签做什么? 用于制作getter 你能更深入地描述一下你的意思吗? 我使用标记之类的标记来定义是否启用调整。 为什么不使用 self.titleLabel?.adjustsFontSizeToFitWidth ?你需要什么额外的东西?【参考方案5】:

在最新的 swift 中,这似乎对我有用

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

【讨论】:

【参考方案6】:

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

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

还没有人提到baselineAdjustment;我需要它,因为在adjustsFontSizeToFitWidth 生效后按钮标签会垂直错位。 Apple 的baselineAdjustment 文档:

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


FWIW,我永远无法让标签完全对齐。

【讨论】:

【参考方案7】:

adjustsFontSizeToFitWidth 对我不起作用,直到我在 Interface Builder 中对我的按钮设置了宽度限制。

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

【讨论】:

【参考方案8】:

基于 Nik Kov 的回答:

import UIKit


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

【讨论】:

这行得通,但是字体大小减少了很多,比如从 17 到 12。当字符串变大时,有什么方法可以增加标题标签的宽度? @R.Mohan 当然,但这都是关于固定宽度的。只要让约束不固定,它就会增长。不要同时设置前导/尾随,也不要设置其中之一 >=【参考方案9】:

在带有 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)
        
    

【讨论】:

【参考方案10】:

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

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

【讨论】:

【参考方案11】:

以下解决方案对我有用:

button.titleLabel?.adjustsFontForContentSizeCategory = true

开发者文档将这个属性解释为:

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

【讨论】:

【参考方案12】:

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

【讨论】:

这没有提供问题的答案。一旦你有足够的reputation,你就可以comment on any post;相反,provide answers that don't require clarification from the asker。 - From Review

以上是关于将 UIButton 字体大小调整为宽度的主要内容,如果未能解决你的问题,请参考以下文章

调整字体大小以适合多个 UIButton,使它们都具有相同的字体大小

将字体大小调整为 uilabel 宽度

是否可以使用 CSS 将字体大小调整为 div 宽度?

查找 UIButton 调整后的字体大小值?

Swift 3 - 调整字体大小以适应宽度,多行

自动调整大小时 UITextField 字体粗细变化