如何调整 UIButton 的大小以适应文本而不使其比屏幕更宽?

Posted

技术标签:

【中文标题】如何调整 UIButton 的大小以适应文本而不使其比屏幕更宽?【英文标题】:How do I resize a UIButton to fit the text without it going wider than the screen? 【发布时间】:2011-02-10 17:16:17 【问题描述】:

我有一个 UIButton,我想调整它的大小以适应其中的任何文本。它的宽度设置为 280,但文本应换行到下一行并根据需要扩展按钮的高度。

我已将换行设置为自动换行并尝试使用 sizeToFit 但这只会使按钮变宽,而不是垂直。

【问题讨论】:

【参考方案1】:

确保您以这种方式设置按钮上的文本:

[myButton setTitle:@"my title" forState:UIControlStateNormal];

...和[myButton sizeToFit] 应该像魅力一样工作。

【讨论】:

我认为这在 type=custom 的按钮上可能无法正常工作【参考方案2】:

[button sizeToFit] 对我不起作用,但我找到了一种单独使用 IB 的方法(xcode 4.5):

    点击UIButton 在大小检查器中将 content hugging 拖到 1(水平和垂直) 将 compression resistance 拖动到 1000(两者都适用) 在 UIButton 的 constraints 下单击 Width 并将 priority 更改为 250 对身高做同样的事情 您可以使用UIButtoninset 来控制左/右/上/下的填充

【讨论】:

您尝试过使用 inset 吗?如果我使用 inset 似乎自动布局在计算预期宽度时没有考虑到,所以即使按钮宽度增加,但它不足以容纳 text+left right inset 使用内容插入而不是标题插入对我有用【参考方案3】:

您可能想查看UIKit Additions to NSString documentation,其中包含限制为特定宽度或框大小的字体测量方法。

当您设置按钮的标题时,您可以使用 sizeWithFont:forWidth:lineBreakMode: 方法测量字符串,并根据返回的大小更新按钮的框架(可能允许一些边缘填充)。

对不起,我没有具体的例子。

【讨论】:

【参考方案4】:

我设法让它在 UIButton 类别中工作:

@interface UIButton (ExpandsVertically)

- (CGSize)sizeThatFits:(CGSize)size;

@end

@implementation UIButton (Expandable)

- (CGSize)sizeThatFits:(CGSize)size 

    // for the width, I subtract 24 for the border
    // for the height, I use a large value that will be reduced when the size is returned from sizeWithFont
    CGSize tempSize = CGSizeMake(size.width - 24, 1000);

    CGSize stringSize = [self.titleLabel.text
                         sizeWithFont:self.titleLabel.font
                         constrainedToSize:tempSize
                         lineBreakMode:UILineBreakModeWordWrap];

    return CGSizeMake(size.width - 24, stringSize.height);


@end

如果有人使用它,请确保设置:

myButton.titleLabel.lineBreakMode = UILineBreakModeWordWrap;

【讨论】:

【参考方案5】:

我也遇到过类似的问题,我的按钮宽度有限,并希望它们垂直增长,具体取决于我给它们的文本量。 根据我在 Apple 文档 (https://developer.apple.com/library/ios/documentation/UserExperience/Conceptual/AutolayoutPG/ImplementingView/ImplementingView.html) 中学到的知识,我最终得到了一个简单的解决方案

我继承了UIButton 并覆盖了两个函数:

- (void)setBounds:(CGRect)bounds 
    if (!CGRectEqualToRect(bounds, self.bounds)) 
        [self invalidateIntrinsicContentSize];
    
    [super setBounds:bounds];


- (CGSize)intrinsicContentSize 
    //
    CGSize size;

    self.titleLabel.frame = CGRectMake(self.titleLabel.frame.origin.x,
            self.titleLabel.frame.origin.y,
            self.frame.size.width - self.contentEdgeInsets.left - self.contentEdgeInsets.right - self.titleEdgeInsets.left - self.titleEdgeInsets.right,
            0);
    size = [self.titleLabel sizeThatFits:self.titleLabel.frame.size];
    size = CGSizeMake(size.width, size.height + 20);

    return size;

这里基本上发生的是按钮使其固有大小无效(仅当边界集实际上是新的 - 这是为了防止无限循环),并且当系统要求固有内容大小时,我重新计算基于在按钮的宽度上。额外的 20px 高度用于填充。 我尝试了许多其他方法,但由于我的布局都是基于 AutoLayout,我想要一些我不必在设备旋转时更新的东西。这很简单。

祝你好运! Z.

【讨论】:

以上是关于如何调整 UIButton 的大小以适应文本而不使其比屏幕更宽?的主要内容,如果未能解决你的问题,请参考以下文章

调整画布图像大小而不使其模糊

如何调整 TextField() 文本的大小以适应 Expanded() 小部件的最大宽度

调整 UILabel 的大小以适应自定义 UITableViewCell 中的文本,无论宽度如何

调整文本大小以适应宽度(1行标签)后,如何在 UILabel 中垂直和水平居中?

自动调整 UILabel 文本大小以适应 UILabel 宽度

如何调整标签大小以适应任何屏幕尺寸