以编程方式快速更改宽高比约束

时间:2019-05-10 13:00:30

标签: ios swift autolayout

我们有一个MainStoryBoard,其中有一个UIButton和一个UIView foo ,有4个约束条件:

  • foo顶部到superView顶部
  • foo领先于superView领先
  • foo尾随superView尾随
  • foo AspectRatio 16:9

该按钮的预期行为应该是它更改foo约束,以便foo将扩展到全屏,并且如果再次按下该按钮,则它应具有以前的宽高比16:9。

我尝试按照以下步骤使用约束的IBOutlet来做到这一点:

  • 展开:
    • 从foo中删除AspectRatio约束
    • 将foo bottom约束添加到superView bottom
  • 崩溃:
    • 将foo底部约束移除到superView底部
    • 将AspectRatio约束添加到foo

我也打得很高,一无所有。预先感谢。

1 个答案:

答案 0 :(得分:0)

您的初始约束应如下所示。

NSLayoutConstraint.activate([
    foo.leadingAnchor.constraint(equalTo: superView.leadingAnchor),
    foo.trailingAnchor.constraint(equalTo: superView.trailingAnchor),
    foo.topAnchor.constraint(equalTo: superView.topAnchor)
])

let collapsedConstraint = foo.heightAnchor.constraint(equalTo: foo.widthAnchor, multiplier: 9/16)
let expandedConstraint = foo.bottomAnchor.constraint(equalTo: superView.bottomAnchor)
if collapsed {
    collapsedConstraint.isActive = true
} else {
    expandedConstraint.isActive = true
}

并且触发的方法应更改这样的约束。

@objc func tapAction() {
    if collapsed {
        collapsedConstraint.isActive = true
        expandedConstraint.isActive = false
    } else {
        collapsedConstraint.isActive = false
        expandedConstraint.isActive = true
    }
    superView.layoutIfNeeded()
}