将UIButton字体大小调整为宽度

时间:2011-05-30 16:16:02

标签: ios objective-c

我有以下代码:

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

完成这项工作,对吧?

10 个答案:

答案 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)

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

enter image description here

答案 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)
        }
    }
}