我有一个 UIButton
,它可以在运行时更改标题。因此,我想增加 UIButton
的高度,这取决于使用 AutoLayout
显示全文的标题文本。
我可以通过将 height constraint
设置为“大于或等于”来增加 UILabel
的高度,但它不适用于 UIButton
。< br/>
我使用了 [myButton sizeToFit]
但它只会增加 UIButon
宽度(不会增加高度)。
我当前的 UIButton
属性现在是
- 约束高度:30
-领先:15
-尾随:15
- 前5
-字体大小:12
更新
我为 UIButton
的约束高度创建了一个 IBOutlet,用于更改 @NSNood
所说的高度。
然后我需要在标题文本中使用 \n
来分割线。
但是我不知道应该把\n
放在哪里?
这是我想要纵向显示的Button
如何确定放置\n
的位置?
请指导我如何使用 AutoLayout
实现它。任何帮助,将不胜感激。
最佳答案
抱歉,我最近没有关注帖子,因此我想出了一个真正迟来的解决方案。如果有人将来可能会觉得它有用,我仍然会写答案作为引用。
首先让我们展示按钮的 Storyboard配置。如下图所示:
图片显示我只为按钮添加了左、上和右约束,没有添加任何其他内容。这允许按钮的高度有一些 intrinsicContentSize
,但它的宽度仍然由它的左右约束决定。
下一阶段是编写一些包含按钮的 ViewController 类。在我的 VC 中,我通过名称 button
为按钮创建了一个导出:
@property(nonatomic,weak) IBOutlet UIButton* button;
并将其附加到 Storyboard按钮。现在我已经覆盖了两个方法,即 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
(标签 holds button text) 是多行的,如果出现一些大文本, 它通过换行来换行文本。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
不遵循任何基于约束的 布局。
结果应该与您可能需要的类似。
如有任何其他说明/疑虑,请随时告诉我。
谢谢。
关于IOS:使用自动布局根据标题文本调整 UIButton 高度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34588598/