IOS:调整UIButton的高度取决于标题文本使用Autolayout?
我有一个UIButton
,它可以在运行时改变标题。 因此,我想通过使用AutoLayout
来增加显示全文的标题文本的UIButton
高度。
我可以通过将height constraint
设置为“大于或等于”来增加UILabel
高度,但它不适用于UIButton
。
我已经使用[myButton sizeToFit]
但它只增加了UIButon
宽度(不增加高度)。
我现在的UIButton
属性是
– 约束高度:30 – 领先:15 – 拖尾:15 – 顶部:5 – 字体大小:12
UPDATE
我为@NSNood
约束高度创build了一个IBOutlet,用于改变@NSNood
所说的高度。
然后,我需要在标题文字中使用\n
来分割线条。
但是我不知道我应该把\n
放在哪里?
这是我想要的肖像Button
这是我想要的横向Button
我怎样才能确定放置的地方\n
?
请指导我如何使用AutoLayout
实现它。 任何帮助,将不胜感激。
对不起,我最近没有跟帖,因此想出了一个真正的晚期解决scheme。 如果有人可能会发现它在未来有用,我仍然在写答案作为参考。
首先我们来看看button的故事板configuration。 那些在以下图片被描绘:
图片显示,我已经添加了button的左边,顶部和右边的限制,没有别的。 这允许button的高度有一些intrinsicContentSize
,但它的宽度仍然由它的左右约束决定。
下一个阶段是编写一些包含button的ViewController类。 在我的VC中,我创build了button名称button
的sockets:
@property(nonatomic,weak) IBOutlet UIButton* button;
并将其附加到故事板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 BC\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
(保存button文本的标签)是多行的,如果有一些大的文本出现,它会通过包装文字来包装文本。 -
viewWillLayoutSubviews
方法确保button布局过程在主视图的边界发生改变时发生,例如由于界面方向的改变。
最后也是最有效的部分是手动处理button的布局过程。 为此,我们需要UIButton
。 我写了一个名为MyButton
inheritance自UIButton
的子类,你可以使用任何你喜欢的名字。 将其设置为Identity Inspector中button的自定义类。
子类覆盖了两个方法,即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
方法来获取布局过程的所有权。 这里的基本想法是确定button的宽度,一旦它被布局。 然后将width的宽度设置为titleLabel
(多行标签应该占用的布局引擎的最大宽度),它是child titleLabel
(保存button文本的标签)。 最后,根据titleLabel
的大小为button返回一个intrinsicContentSize
,以便button完全包装titleLabel
。
- 覆盖
layoutSubviews
被调用,当button已经铺好,它的框架大小被确定。 在第一步中,button的呈现宽度被设置为button的titleLabel
的titleLabel
。 - 第二步通过调用
[super layoutSubviews]
重新调用布局引擎,以便按照它的titleLabel
的preferredMaxLayoutWidth
(现在设置为button的宽度)重新确定buttonintrinsicContentSize
。 - 在覆盖的
intrinsicContentSize
方法中,我们返回button的最小拟合大小,该大小将使用preferredMaxLayoutWidth
集完全包装titleLabel
。 我们在button的titleLabel
上使用了sizeThatFits
方法,而且titleLabel
不会遵循任何基于约束的布局。
结果应该类似于你可能需要的。
随时让我知道任何其他澄清/关注。
谢谢。
重点是,如果你设置了sizeToFit
属性,那么文本将总是在一行中,并且button的宽度将会增加,除非你把下一行符号\n
明确地说明你想要多行。
你把'\ n'放在第一行的结尾,就像表示的"line \n line"
line line
如果您想对纵向和横向使用两个不同的string值(使用\n
定位不同),可以使用此处所述的 UIDeviceOrientation
( UIDevice.currentDevice.orientation
)检查方向条件,并根据设备的方向设置string值