我有一个UIButton
它可以在运行时更改标题.因此,我想通过使用增加UIButton
高度取决于标题文本以显示全文AutoLayout
.
我可以UILabel
通过设置height constraint
为"大于或等于" 来增加高度,但它不起作用UIButton
.
我用过[myButton sizeToFit]
但它只增加UIButon
宽度(不增加高度).
我现在的UIButton
属性是
- 约束高度:30 - 领先:15 - 尾随:15 - 顶部:5 - fontsize:12
更新
我为约束高度创建了一个IBOutlet,UIButton
用于更改高度@NSNood
.
然后我需要\n
在标题文本中使用分割线.
但我不知道我应该把它放在哪里\n
?
这是Button
我想要的肖像
这是Button
我想要的景观
我该如何确定放置的位置\n
?
请指导我如何实现它AutoLayout
.任何帮助,将不胜感激.
对不起,我最近没有关注这个帖子,因此我想出了一个真正的后期解决方案.如果有人可能在将来发现它有用的话,我仍然会将答案作为参考.
首先让我们展示按钮的故事板配置.这些如下图所示:
图片显示我只为按钮添加了左,上,右约束,没有别的.这允许按钮有一些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
方法.这里的基本思想是确定按钮宽度,一旦布局.然后将其宽度设置为preferredMaxLayoutWidth
(布局引擎的最大宽度,多行标签应占用的宽度)其子项titleLabel
(包含按钮文本的标签).最后,intrinsicContentSize
根据按钮titleLabel
的大小返回按钮,以便按钮完全包裹它titleLabel
.
layoutSubviews
当按钮已经布局并且确定了帧的大小时,将调用被覆盖的内容.在它的第一步骤中,按钮的呈现宽度被设定为preferredMaxLayoutWidth
按钮的的titleLabel
.
通过调用第二步骤重新调用布点引擎[super
layoutSubviews]
,从而使按钮intrinsicContentSize
是基于它的重新确定titleLabel
的
preferredMaxLayoutWidth
,其被设置为呈现宽度,由现在的按钮.
在重写intrinsicContentSize
方法中,我们返回完全titleLabel
用preferredMaxLayoutWidth
set集合的按钮的最小拟合大小
.我们sizeThatFits
在按钮上使用
拟合方法,titleLabel
并且只是titleLabel
不遵循任何基于约束的布局.
结果应该类似于您可能需要的结果.
请随时告诉我任何其他澄清/关注.
谢谢.