【问题标题】:UIButton Adjust View Height Based on Title (Swift)UIButton根据标题调整视图高度(Swift)
【发布时间】:2014-12-15 18:41:36
【问题描述】:

我试图弄清楚如何调整我的UIButton 框架的高度,以便它在给定宽度下匹配其TitleLabel 内容的高度。我目前正在viewDidAppear 执行此操作。

我尝试通过NSLayoutConstraint 使用类似以下的方式来执行此操作:

let attributeString = NSAttributedString(string: button.titleForState(.Normal)!)
let rect = attributeString.boundingRectWithSize(CGSizeMake(self.view.frame.width, CGFloat.max), options: NSStringDrawingOptions.UsesLineFragmentOrigin, context: nil)

var heightConstraint = NSLayoutConstraint(item: button, attribute: .Height, relatedBy: .Equal, toItem: button, attribute: .Height, multiplier: 1.0, constant: rect.height)

并通过直接使用上面计算的rect 设置UIButtonframe

button.frame = CGRectMake(0, 0, self.view.frame.width, rect.height)

但是,我无法影响按钮视图的高度。我偶然能够改变高度的唯一方法是摆弄NSLayoutConstraintmultiplier 属性,但它会以不可预知的方式改变高度。

有人知道怎么做吗?

编辑

我应该补充一点,文本通过NSLineBreakMode.ByWordWrapping 成功换行。这是我的完整按钮结构:

let button = UIButton.buttonWithType(.System) as UIButton
button.setTitle(title, forState: .Normal)
button.titleLabel?.lineBreakMode = NSLineBreakMode.ByWordWrapping
button.titleLabel?.textAlignment = NSTextAlignment.Center
button.setTranslatesAutoresizingMaskIntoConstraints(false)

这是问题的截图: http://i.imgur.com/dEJVRxc.png

【问题讨论】:

  • 你试过将 lineNumber 设置为 0 吗?
  • @Aggressor 是的,我有。刚刚又试了,没有效果。
  • 编辑框架和约束是一项冒险的事情。每当视图刷新时,它将覆盖您的框架以设置约束。我怀疑您有限制按钮的约束。尝试从界面构建器中删除按钮并在 viewDidAppear 块中以编程方式创建它。
  • 您的另一个选择是通过代码更改按钮上的约束
  • @Aggressor 我实际上并没有为此使用 Interface Builder。所有视图和约束都是以编程方式生成的。我在上面的问题中粘贴的高度约束似乎没有任何效果,除非 multiplier 被更改。我希望我能够使用该约束的 constant 属性来改变高度,但没有运气。

标签: ios swift uiview uibutton


【解决方案1】:

我找不到任何好的“自动”方法来做到这一点。对我有用的方法是在 UIButton 子类中覆盖 setTitle:forState:,并计算用于调整高度约束的文本大小。该按钮有一个高度约束(使用 IBOutlet heightCon),还有一个在 IB 中设置的宽度约束(如果你不使用 IB,你可以在代码中添加这些)

override func setTitle(title: String?, forState state: UIControlState) {
        super.setTitle(title, forState: state)
        let attributeString = NSAttributedString(string: currentTitle!, attributes: [NSFontAttributeName: titleLabel!.font])
        let rect = attributeString.boundingRectWithSize(CGSizeMake(self.frame.width, CGFloat.max), options: NSStringDrawingOptions.UsesLineFragmentOrigin, context: nil)
        heightCon.constant = rect.size.height + titleEdgeInsets.top + titleEdgeInsets.bottom
    }

【讨论】:

  • 谢谢,这也是我最终得出的解决方案。
猜你喜欢
  • 2014-04-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-12
相关资源
最近更新 更多