Iphone 如何调整UIButton的大小以适应文本而不使其超出屏幕?

Iphone 如何调整UIButton的大小以适应文本而不使其超出屏幕?,iphone,uibutton,Iphone,Uibutton,我有一个UIButton,我想调整它的大小以适应里面的任何文本。它的设置宽度为280,但文本应换行到下一行,并根据需要延长按钮的高度 我已将换行符设置为Word Wrap,并尝试了sizeToFit,但这只会使按钮变宽,而不是垂直。您可能需要查看,其中包括限制为特定宽度或框大小的字体测量方法 例如,设置按钮标题时,可以使用sizeWithFont:forWidth:lineBreakMode:方法测量字符串,并根据返回的大小更新按钮框架(可能允许在边缘周围添加一些填充) 对不起,我没有一个具体的

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


我已将换行符设置为Word Wrap,并尝试了sizeToFit,但这只会使按钮变宽,而不是垂直。您可能需要查看,其中包括限制为特定宽度或框大小的字体测量方法

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


对不起,我没有一个具体的例子给你。

我设法让它在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;

确保按以下方式设置按钮上的文本:

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

。。。而且
[myButton sizeToFit]
应该可以很好地工作。

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

  • 单击
    ui按钮
  • 在“大小检查器”中,将内容包围拖动到1(水平和垂直)
  • 将压缩阻力
    拖动到1000(对于两者)
  • 在UIButton的
    约束下
    单击
    宽度
    并将
    优先级
    更改为250
  • 身高也一样
  • 您可以使用
    ui按钮
    inset
    控制左/右/上/下填充

  • 我一直面临着类似的问题,我的按钮宽度有限,希望它们垂直增长,这取决于我给它们的文本量。 根据我在苹果文档中学到的知识,我最终得出了一个简单的解决方案()

    我已将
    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高度用于填充。 我尝试过很多其他的方法,但是由于我的布局都是基于自动布局的,所以我想要的东西不必在设备旋转时更新。这很管用

    祝你好运!
    Z.

    我认为这在type=custom的按钮上可能无法正常工作。您是否尝试使用插图?如果我使用插入,在计算预期宽度时,autolayout似乎没有考虑到这一点,因此即使按钮宽度增加,但它不足以容纳文本+左右插入内容插入,而不是标题插入