抱歉,我最近没有关注该帖子,因此我想出了一个真正迟到的解决方案。我仍然在写答案作为参考,如果将来有人会发现它有用的话。
首先让我们展示按钮的情节提要配置。如下图所示:
图片显示我只为按钮添加了左、上和右约束,没有其他任何东西。这允许按钮有一些intrinsicContentSize 的高度,但它的宽度仍然由它的左右约束决定。
下一个阶段是编写一些包含按钮的 ViewController 类。在我的 VC 中,我为按钮创建了一个出口,名称为 button:
@property(nonatomic,weak) IBOutlet UIButton* button;
并将其附加到情节提要按钮上。现在我已经覆盖了两种方法,即viewDidLoad 和viewWillLayoutSubviews,如下所示:
-(void)viewDidLoad {
[super viewDidLoad];
self.button.titleLabel.numberOfLines = 0;
self.button.titleLabel.lineBreakMode = NSLineBreakByWordWrapping;
}
-(void)viewWillLayoutSubviews {
[super viewWillLayoutSubviews];
[self.button setTitle:@"Chapter One\n "
"A Stop on the Salt Route\n "
"1000 B.C.\n "
"As they rounded a bend in the path that ran beside the river, Lara recognized the silhouette of a fig tree atop a nearby hill. The weather was hot and the days were long. The fig tree was in full leaf, but not yet bearing fruit." forState:UIControlStateNormal];
}
-
viewDidLoad 方法确保titleLabel(
保存按钮文本)是多行的,如果出现一些大文本,
它通过换行来换行文本。
-
viewWillLayoutSubviews 方法确保按钮布局过程
每当主视图的边界发生变化时发生,例如因为
改变界面方向。
最后也是最有效的部分是手动处理按钮的布局过程。为此,我们需要继承UIButton。我编写了一个名为MyButton 的子类,它继承自UIButton,你可以使用任何你喜欢的名字。将此设置为 Identity Inspector 中按钮的自定义类。
子类覆盖两个方法,即intrinsicContentSize 和layoutSubviews。类主体如下所示:
#import "MyButton.h"
@implementation MyButton
-(CGSize)intrinsicContentSize {
return [self.titleLabel sizeThatFits:CGSizeMake(self.titleLabel.preferredMaxLayoutWidth, CGFLOAT_MAX)];;
}
-(void)layoutSubviews {
self.titleLabel.preferredMaxLayoutWidth = self.frame.size.width;
[super layoutSubviews];
}
@end
UIButon 子类通过覆盖layoutSubviews 方法来获得布局过程的所有权。这里的基本思想是确定按钮宽度,一旦它已经布局。然后将其子titleLabel(保存按钮文本的标签)的宽度设置为preferredMaxLayoutWidth(布局引擎的最大宽度,多行标签应占据的宽度)。最后,根据titleLabel 的大小为按钮返回intrinsicContentSize,以便按钮完全包裹titleLabel。
- 当按钮已经存在时调用被覆盖的
layoutSubviews
布局并确定其框架大小。在它的第一步,
按钮的渲染宽度设置为preferredMaxLayoutWidth
按钮的titleLabel。
- 第二步通过调用
[super
layoutSubviews]重新调用布局引擎,这样按钮intrinsicContentSize就是
根据titleLabel的重新确定
preferredMaxLayoutWidth,设置为按钮渲染宽度,
到现在为止。
- 在被覆盖的
intrinsicContentSize 方法中,我们返回
完全包裹它的按钮的最小尺寸
titleLabel 与 preferredMaxLayoutWidth 设置。我们用
sizeThatFits 适合按钮的 titleLabel 方法,并且
就像titleLabel 一样工作,不遵循任何基于约束
布局。
结果应该类似于您可能需要的结果。
如有任何其他澄清/疑虑,请随时告诉我。
谢谢。