如何以编程方式将UIButton的大小调整为文本大小并保持一个漂亮的填充?

时间:2011-08-31 15:52:56

标签: iphone ios uibutton

我有一个动态创建的按钮,需要调整大小。它有足够的空间可以增长,但是调用sizeToFit接缝什么都不做,或者至少不能放大按钮。

如何获得所需效果?

2 个答案:

答案 0 :(得分:2)

查看NSString方法-sizeWithFont:。它会返回CGSize,告知您按钮中文本的大小。然后,您可以根据此大小调整按钮的框架,将所需的填充添加到按钮框架的宽度和高度。像这样:

NSString *msg = @"The button label";
UIFont *font = [UIFont systemFontOfSize:17];
CGSize msgSize = [msg sizeWithFont:font];
CGRect frame = button.frame;
frame.size.width = msg.size.width+10;
frame.size.height = msg.size.height+10;
button.frame = frame;

(从内存写入;未编译。: - )

当然,您还必须设置按钮标题和字体......

答案 1 :(得分:1)

在iOS 7中,sizeWithFont:已折旧。现在你应该使用sizeWithAttribute:。

但那并不是我如何解决这个问题。有两种方法可以解决这个问题:

1)要使用[button sizeToFit],请确保禁用AutoLayout。否则,您将无法以编程方式调整按钮的大小。您必须调整约束的大小。

2)但是,这个答案在使用上非常有限。在我即将向您展示的示例中,按钮将离开屏幕,因为文本全部在一行上。要在约束宽度时更改按钮的高度,请使用以下代码。 再次确保自动布局已关闭,否则无效。

    UIFont *font = [UIFont fontWithName:@"Helvetica-Bold" size:14.0];
    NSString *text = @"This is a very long new title for the button to be sure, now I'm going to add even more";

    [self.testButton setTitle:text forState:UIControlStateNormal];
    self.testButton.titleLabel.font = font;

    CGFloat width = self.testButton.frame.size.width - 10;  //button width - padding width
    NSAttributedString *attributedText = [[NSAttributedString alloc] initWithString:text attributes:@{NSFontAttributeName: font}];
    CGRect rect = [attributedText boundingRectWithSize:(CGSize){width, CGFLOAT_MAX}
                                               options:NSStringDrawingUsesLineFragmentOrigin
                                               context:nil];
    CGSize size = rect.size;
    size.height = ceilf(size.height);
    size.width = ceilf(size.width);
    self.testButton.frame = CGRectMake(self.testButton.frame.origin.x, self.testButton.frame.origin.y, self.testButton.frame.size.width, size.height + 15);

因为boundingRectWithSize会传递一个非整数大小的矩形,你必须使用ceilf进行舍入。

在我将宽度传递给boundingRectWithSize之前,我从宽度中减去10来为我的按钮创建填充。