UIButton未自动调整字体大小

24

我正在以编程方式向我的视图添加一个 UIButton,我希望按钮的字体大小能够自动调整(例如,如果文本很长,则将其调整为较小的字体以适合按钮)。

下面的代码无效(字体始终相同):

myButton = [UIButton buttonWithType: UIButtonTypeRoundedRect];
[myButton setTitle:[NSString stringWithFormat:@"hello"] forState:UIControlStateNormal];
[myButton setFrame: CGRectMake(0, 0, 180, 80)];
[myButton.titleLabel setFont: [UIFont boldSystemFontOfSize:16.0]];

myButton.titleLabel.adjustsFontSizeToFitWidth = TRUE;

[theView addSubview:myButton];

看看这个:https://dev59.com/Xm025IYBdhLWcg3wKSiP,对我很有帮助。 - jere
还可以尝试在按钮的titleLabel上调用sizeToFit方法。 - danielbeard
你想要什么行为?你想让文本扩展以适应按钮,你想让按钮缩小以适应文本,还是你想让文本缩小而不是被剪辑,如果它太大而无法适应? - Ander
1个回答

41
代码可以运行,但可能不是你想要的方式。adjustsFontSizeToFitWidth属性只有在文本无法适合宽度(最小字体大小)时才会减小字体大小,它永远不会增加字体大小。在这种情况下,一个16pt的“hello”轻松适合180pt宽的按钮,因此不会发生任何调整大小操作。如果您希望字体增大以适应可用的空间,则应将其增加到较大的数字,以便将其缩小到适合的最大尺寸。
为了展示当前的工作方式,这里有一个很好的假设性例子(单击按钮以缩小其宽度并查看字体缩小到最小字体大小):
- (void)viewDidLoad {
    [super viewDidLoad];

    UIButton *myButton = [UIButton buttonWithType: UIButtonTypeRoundedRect];
    [myButton setTitle:[NSString stringWithFormat:@"hello"] forState:UIControlStateNormal];
    [myButton setFrame: CGRectMake(10, 10, 300, 120)];
    [myButton.titleLabel setFont: [UIFont boldSystemFontOfSize:100.0]];
    myButton.titleLabel.adjustsFontSizeToFitWidth = YES;
    myButton.titleLabel.minimumFontSize = 40;
    [myButton addTarget:self action:@selector(buttonTap:) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:myButton];
}

- (void)buttonTap:(UIButton *)button {
    button.frame = CGRectInset(button.frame, 10, 0);
}

1
Ander,你的代码非常好用,非常感谢!!!我仍然遇到的唯一问题是,更改按钮内容(文本)时,它会在按钮内部向上或向下重新定位,而不是保持居中。似乎起始位置也受初始字体大小的影响,即使稍后进行了调整。我已经尝试过setContentVerticalAlignment:UIControlContentVerticalAlignmentCenter,但似乎没有任何作用。 - flip79
1
代码运行正常!我想要更新:使用'minimumScaleFactor'替代'minimumFontSize',因为它已经过时了。这样我们就可以将最小字体大小设置为-> myButton.titleLabel.minimumScaleFactor = 0.4; (40 / 100)。 谢谢.. :) - Manann Sseth
感谢您的回答 - 我正在寻找一种在Storyboard中创建的UIButtons上执行此操作的方法,其中它具有UILabel的设置,但没有UIButton。这确实按预期工作 - 是的,应该使用minimumScaleFactor - Erik van der Neut
如果您选择UIButton并查看身份检查器,则可以在Storyboard中设置值。 在“用户定义的运行时属性”下,输入要修改的关键路径、类型和值。 在这种情况下:titleLabelFontSizeToFitWidth,布尔值,是; titleLabel.minimumScaleFactor,数字,0.2。 它非常好用,无需添加代码。 - Paul Linsay

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接