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。 现在我重写了两个方法,即viewDidLoadviewWillLayoutSubviews如下所示:

 -(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]; } 
  1. viewDidLoad方法确保titleLabel (保存button文本的标签)是多行的,如果有一些大的文本出现,它会通过包装文字来包装文本。
  2. viewWillLayoutSubviews方法确保button布局过程在主视图的边界发生改变时发生,例如由于界面方向的改变。

最后也是最有效的部分是手动处理button的布局过程。 为此,我们需要UIButton 。 我写了一个名为MyButtoninheritance自UIButton的子类,你可以使用任何你喜欢的名字。 将其设置为Identity Inspector中button的自定义类。

子类覆盖了两个方法,即intrinsicContentSizelayoutSubviews 。 类体如下所示:

 #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

  1. 覆盖layoutSubviews被调用,当button已经铺好,它的框架大小被确定。 在第一步中,button的呈现宽度被设置为button的titleLabeltitleLabel
  2. 第二步通过调用[super layoutSubviews]重新调用布局引擎,以便按照它的titleLabelpreferredMaxLayoutWidth (现在设置为button的宽度)重新确定buttonintrinsicContentSize
  3. 在覆盖的intrinsicContentSize方法中,我们返回button的最小拟合大小,该大小将使用preferredMaxLayoutWidth集完全包装titleLabel 。 我们在button的titleLabel上使用了sizeThatFits方法,而且titleLabel不会遵循任何基于约束的布局。

结果应该类似于你可能需要的。

肖像 景观

随时让我知道任何其他澄清/关注。

谢谢。

重点是,如果你设置了sizeToFit属性,那么文本将总是在一行中,并且button的宽度将会增加,除非你把下一行符号\n明确地说明你想要多行。

你把'\ n'放在第一行的结尾,就像表示的"line \n line"

 line line 

如果您想对纵向横向使用两个不同的string值(使用\n定位不同),可以使用此处所述的 UIDeviceOrientationUIDevice.currentDevice.orientation )检查方向条件,并根据设备的方向设置string值