重新限制 UIButton 的宽度

Posted

技术标签:

【中文标题】重新限制 UIButton 的宽度【英文标题】:Reconstrain width of a UIButton 【发布时间】:2016-09-30 21:49:11 【问题描述】:

我正在以编程方式使用自动布局约束,我想根据按钮更改的标题重置按钮的宽度。假设我没有参考在其上设置的旧宽度约束,我该如何重新约束它的宽度?在我看来,创建新的宽度约束不起作用——我需要停用旧的,然后激活新的。但我没有提到旧的。

// adding a new constraint
myButton.widthAnchor.constraintEqualToConstant(myNewWidth).active = true

【问题讨论】:

你为什么不参考旧的宽度约束?默认情况下,按钮宽度会拥抱它的内容,所以也许你甚至根本不需要宽度约束。设置水平中心,也许是最大宽度 我正在尝试编写一个重新约束参数的通用方法,在本例中为 UIButton。查询锚点上的所有约束会很好。 【参考方案1】:

在你的类中创建一个 NSLayoutConstraint 属性。当您以编程方式设置按钮的宽度约束时,请为此属性分配新约束。

那么当你需要更新约束时就这样做

myWidthConstraint.constant = newValue

【讨论】:

我同意保留对约束的引用很有用,但最好查询宽度锚的约束,例如。【参考方案2】:

你可以试试这个。我还没试过。首先,您需要过滤一堆约束或全部循环并找到所需的约束。为此,您可以使用它。

var constraint: NSLayoutConstraint! = nil
let constraints = myButton.constraintsAffectingLayoutForAxis(UILayoutConstraintAxis.Horizontal)

否则这将得到你所有的限制。

var constraint: NSLayoutConstraint! = nil

然后你需要遍历它们,像这样找到需要的。

for const in myButton.constraints 
    if const.firstAttribute == NSLayoutAttribute.Width 
        constraint = const 
        break
    

宽度约束的第一个属性始终设置为“宽度”,您也可以使用 if 子句对应用约束的项目进行如下额外检查

const.firstItem as! NSObject == myButton

因为宽度约束的第一项就是它本身。 尝试是否有效。如果你找到它,我建议删除特定约束并添加新约束。在下面的项目上添加宽度约束是代码。假设你想要的宽度是 50 px。

myButton.addConstraint(NSLayoutConstraint(item: myButton, attribute: NSLayoutAttribute.Width, relatedBy: NSLayoutRelation.Equal, toItem: nil, attribute: NSLayoutAttribute.NotAnAttribute, multiplier: 1.0, constant: 50.0))

这是正确的方法。不要激活或停用它。

【讨论】:

以上是关于重新限制 UIButton 的宽度的主要内容,如果未能解决你的问题,请参考以下文章

UIbutton忘记宽度和高度

Swift - UIButton 改变宽度

在多行 UIButton 的文本中查找字母的运行时位置

根据文本调整 UIButton 大小的最简单方法

如何修复 UIButton 的图像大小?

UIButton 约束问题