IOS:使用自动布局根据标题文本调整 UIButton 高度?

标签 ios objective-c iphone uibutton autolayout

我有一个 UIButton,它可以在运行时更改标题。因此,我想增加 UIButton 的高度,这取决于使用 AutoLayout 显示全文的标题文本。

我可以通过将 height constraint 设置为“大于或等于”来增加 UILabel 的高度,但它不适用于 UIButton。< br/> 我使用了 [myButton sizeToFit] 但它只会增加 UIButon 宽度(不会增加高度)。

我当前的 UIButton 属性现在是
- 约束高度:30 -领先:15 -尾随:15 - 前5 -字体大小:12

更新
我为 UIButton 的约束高度创建了一个 IBOutlet,用于更改 @NSNood 所说的高度。
然后我需要在标题文本中使用 \n 来分割线。
但是我不知道应该把\n放在哪里?

这是我想要纵向显示的Button

enter image description here

这是我想要横向显示的Button enter image description here

如何确定放置\n的位置?

请指导我如何使用 AutoLayout 实现它。任何帮助,将不胜感激。

最佳答案

抱歉,我最近没有关注帖子,因此我想出了一个真正迟来的解决方案。如果有人将来可能会觉得它有用,我仍然会写答案作为引用。

首先让我们展示按钮的 Storyboard配置。如下图所示:

Constraint configuration

图片显示我只为按钮添加了左、上和右约束,没有添加任何其他内容。这允许按钮的高度有一些 intrinsicContentSize,但它的宽度仍然由它的左右约束决定。

下一阶段是编写一些包含按钮的 ViewController 类。在我的 VC 中,我通过名称 button 为按钮创建了一个导出:

@property(nonatomic,weak) IBOutlet UIButton* button;

并将其附加到 Storyboard按钮。现在我已经覆盖了两个方法,即 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 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];
}
  1. viewDidLoad 方法确保 titleLabel(标签 holds button text) 是多行的,如果出现一些大文本, 它通过换行来换行文本。
  2. viewWillLayoutSubviews 方法确保按钮布局过程 每当主视图的边界发生变化时发生,例如因为 改变界面方向。

最后也是最有效的部分是手动处理按钮的布局过程。为此,我们需要继承 UIButton。我编写了一个名为 MyButton 的子类,它继承自 UIButton,您可以使用任何您喜欢的名称。在 Identity Inspector 中将其设置为按钮的自定义类。

子类覆盖了两个方法,即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 方法获得布局过程的所有权。这里的基本思想是在布局后确定按钮的宽度。然后将宽度设置为其子 titleLabel(包含按钮文本的标签)的 preferredMaxLayoutWidth(布局引擎的最大宽度,多行标签应占据的宽度)。最后,根据按钮的 titleLabel 大小返回按钮的 intrinsicContentSize,以便按钮完全包裹它的 titleLabel

  1. 重写的 layoutSubviews 在按钮已经打开时被调用 布局和它的框架大小是确定的。在它的第一步, 按钮的呈现宽度设置为 preferredMaxLayoutWidth 按钮的 titleLabel
  2. 第二步通过调用[super layoutSubviews],这样按钮 intrinsicContentSize 就是 根据它的titleLabel重新确定 preferredMaxLayoutWidth,设置为按钮渲染宽度, 到现在为止。
  3. 在覆盖的 intrinsicContentSize 方法中,我们返回 完全包裹按钮的最小尺寸 titleLabel 设置了 preferredMaxLayoutWidth。我们用 sizeThatFits 适合按钮的 titleLabel 上的方法 简单地作为 titleLabel 不遵循任何基于约束的 布局。

结果应该与您可能需要的类似。

Portrait Landscape

如有任何其他说明/疑虑,请随时告诉我。

谢谢。

关于IOS:使用自动布局根据标题文本调整 UIButton 高度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34588598/

相关文章:

ios - 直接从突出显示的颜色切换颜色到另一种颜色

objective-c - "spaces"、 "dashes (-)"、 "apostrophes (' )", and "字母的正则表达式"

iphone - 在后台线程上将 SVG XML NSString 转换为 UIImage

iphone - 为什么在使用全局调度队列时不调用 NSURLConnection 委托(delegate)方法?

iphone - sdwebImage setImageWithURL : placeholderImage: completed:

ios - 从 iOS 8.2 开始,时间准确性有所提高?

ios - 如何在 Swift3 中执行 timeIntervalSinceNow?

objective-c - 在 iOS 中定义布局

objective-c - Objective-C 接口(interface)的前向声明

iPhone/iPad 圆形强度计控制(含图像)