将UIButton字体大小调整为宽度


122

我有以下代码:

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

做这份工作,对不对?


它应该可以工作,或者theLabel.adjustsFontSizeToFitWidth = YES。
路加福音

它的工作原理是titleButton.setContentCompressionResistancePriority(.defaultLow, for: .horizontal)
onmyway133 '17

Answers:


291

试试这个:

button.titleLabel.numberOfLines = 1;
button.titleLabel.adjustsFontSizeToFitWidth = YES;
button.titleLabel.lineBreakMode = NSLineBreakByClipping; //<-- MAGIC LINE

我不确定为什么能做到这一点,但它能做到:)


1
谢谢,而button.titleLabel.lineBreakMode = UILineBreakModeClip; <
-MAGIC

8
@yunas用NSLineBreakByClipping替换UILineBreakModeClip
CodeReaper 2013年

1
Nvm,将其更改numberOfLines为0
Marty

34
button.titleLabel.adjustsFontSizeToFitWidth = YES;

如果您使用的是自动版式,并且对按钮的宽度设置了限制,则应该自己完成工作。

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


15

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和可调整大小的窗口执行相同操作?
Leo Dabus 2014年

在我看来,这与使用Xcode IB选择标签并将其设置为Autoshrink最小字体比例为0.01相同
Leo Dabus 2014年

使用NSTextField时没有自动收缩选项
Leo Dabus 2014年

UITextField具有自动收缩文本的选项,而NSTextField没有。因此,我认为您需要手动调整字体以适合文本字段的宽度。
Alexander Belyavskiy 2014年

10

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

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

10

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

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

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

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


FWIW,我永远无法使标签完美对齐。


8

adjustsFontSizeToFitWidth 直到我在Interface Builder中为按钮设置了宽度限制后,它才对我有用。

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


8

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

在此处输入图片说明


您使用标签做什么?
Zaporozhchenko Oleksandr,

可用于使吸气剂
Nik Kov '18

您能否更深入地描述您的意思?
Zaporozhchenko Oleksandr,

我使用标记等标记来定义是否启用调整。
Nik Kov

您为什么不只使用self.titleLabel?.adjustsFontSizeToFitWidth?你需要什么额外的东西?
Zaporozhchenko Oleksandr,

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

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


3

根据Nik Kov的答案:

import UIKit


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

这可以工作,但是字体大小却减小了很多,例如从17减小到12。当字符串较大时,是否可以增加titlelabel的宽度?
R. Mohan

@ R.Mohan可以肯定,但这全都是关于固定宽度的。只要使约束不固定,它就会增长。不要同时设置领先/尾随,也不要设置其中一个> =
Zaporozhchenko Oleksandr '18

0

下面的解决方案为我工作:

button.titleLabel?.adjustsFontForContentSizeCategory = true

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

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


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)
        }
    }
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.