如何使用自动布局在代码中使用多行标签创build和添加UIButton?

有很多链接如何调整标签的大小,但是缺less如何根据标签大小调整UIButton大小的信息。 目前,我有自动布局设置屏幕视图(所有的系统约束是从IB添加),一切工作正常,但需要在屏幕底部添加dynamic内容。 我需要创build并随机添加随机数字的随机长度的标题。 所以,这里是创build和添加button的代码片段:

// Loop UIButton *myButton = [UIButton new]; UIButton.frame = CGRectMake(0, previousButtonOriginY, self.view.bounds.size.width, 20); myButton.titleLabel.lineBreakMode = NSLineBreakByWordWrapping; myButton.titleLabel.textAlignment = NSTextAlignmentLeft; myButton.contentHorizontalAlignment = UIControlContentHorizontalAlignmentLeft; [myButton setTitle:@"very long title..." forState:UIControlStateNormal]; myButton.titleLabel.numberOfLines = 0; [self.footerView addSubview:myButton]; 

问题是button的框架高度保持20px,但标签string显示在三行上,因此与另一个button标题重叠。 如果我添加[myButton sizeToFit],那么button的宽度就会resize以适合所有的文本到一行,所以标题超出了屏幕。

如果我添加[myButton sizeThatFits:CGSizeMake(320,100)],那么resize根本不起作用。 我知道sizeToFit不应该被称为所有,因为它不是自动布局的一部分,但是需要build议,如何轻松地使button适合其标签屏幕320宽度。

我觉得我需要从代码中添加系统约束,但之前没有这样做,所以不知道它应该如何。 我可能需要从代码中添加大量的约束才能使这个简单的事情工作:)

而不是使用Autolayout ,你可以使用一个集合视图 ,为你更好的select布局button等元素。

在旋转下也能更好地处理布局。

或者你可以使用这个代码,它为我工作…

例如,在这里replace你想要的填充值:

UIButton * myButton = [[UIButton alloc] init];

 // setup some autolayout constraints here myButton.titleEdgeInsets = UIEdgeInsetsMake(-desiredBottomPadding, -desiredRightPadding, -desiredTopPadding, -desiredLeftPadding); 

结合正确的自动布局约束,您将得到一个包含图像和文本的自动resize的button!

对于这种定制,您需要创build一个UIButton的子类。 在子类中,你可以添加一个定制的标签,这有利于你的需求。 您也可以覆盖setTitle:forState方法来自动更新您的自定义标签。