【问题标题】:Automatically adjust view width when other views' constraints change当其他视图的约束发生变化时自动调整视图宽度
【发布时间】:2015-06-22 18:32:00
【问题描述】:

我正在尝试在 AutoLayout 中定义约束,当另一个视图发生变化时,它会自动调整视图的大小。

有两个并排的视图,我希望右侧的视图仅通过简单地使左侧视图变薄(而不是直接更改右侧视图的宽度约束)来增长。 我在问这是否可以通过巧妙地使用约束来完成。

更改不需要动画。

这是应用程序中的所有代码:

class ViewController: UIViewController {

    var view1 = UIView()
    var view2 = UIView()
    var h1Constraints: [AnyObject]?
    var h2Constraints: [AnyObject]?
    var v1Constraints: [AnyObject]?
    var v2Constraints: [AnyObject]?

    override func viewDidLoad() {
        super.viewDidLoad()

        // Boilerplate
        view1.backgroundColor = UIColor.redColor()
        view2.backgroundColor = UIColor.greenColor()
        view2.addGestureRecognizer(UITapGestureRecognizer(target: self, action: "grow"))
        view1.setTranslatesAutoresizingMaskIntoConstraints(false)
        view2.setTranslatesAutoresizingMaskIntoConstraints(false)
        view.addSubview(view1)
        view.addSubview(view2)


        // Constraints
        let views = ["view1":view1, "view2": view2]
        let metrics = ["halfScreenWidth":view.frame.size.width/2, "screenHeight":view.frame.size.height]

        h1Constraints = NSLayoutConstraint.constraintsWithVisualFormat("H:|[view1(>=halfScreenWidth)]->=0-|", options: NSLayoutFormatOptions(0), metrics: metrics, views: views)
        h2Constraints = NSLayoutConstraint.constraintsWithVisualFormat("H:|->=0-[view2(>=halfScreenWidth)]|", options: NSLayoutFormatOptions(0), metrics: metrics, views: views)

        v1Constraints = NSLayoutConstraint.constraintsWithVisualFormat("V:|[view1(screenHeight)]", options: NSLayoutFormatOptions(0), metrics: metrics, views: views)
        v2Constraints = NSLayoutConstraint.constraintsWithVisualFormat("V:|[view2(screenHeight)]", options: NSLayoutFormatOptions(0), metrics: metrics, views: views)

        view.addConstraints(h1Constraints!)
        view.addConstraints(h2Constraints!)
        view.addConstraints(v1Constraints!)
        view.addConstraints(v2Constraints!)
    }


    @objc func grow() {
        for var index = 0; index < h1Constraints?.count; ++index {
            var constraint = h1Constraints![index] as! NSLayoutConstraint
            if constraint.firstAttribute == .Width {
                constraint.constant = 20
            }
        }
        self.view.layoutIfNeeded()
    }
}

我只是想告诉布局引擎视图都大于或等于屏幕宽度的一半,同时具有可调节的边距(大于,或等于 0)

这样,当我将左侧视图的宽度更改为 20 时,我认为右侧视图会变大,因为它声明了 >= 宽度。

这不起作用。当左侧缩小时,右侧保持原样。

这种关系可以通过自动布局实现吗?


编辑:

根据@luk2302 的回答,解决方案如下:

// Constraints
let views = ["view1":view1, "view2": view2]
let metrics = ["halfScreenWidth":view.frame.size.width/2, "screenHeight":view.frame.size.height]

h1Constraints = NSLayoutConstraint.constraintsWithVisualFormat("H:|[view1(>=halfScreenWidth)][view2(>=halfScreenWidth)]|", options: NSLayoutFormatOptions(0), metrics: metrics, views: views)

v1Constraints = NSLayoutConstraint.constraintsWithVisualFormat("V:|[view1(screenHeight)]", options: NSLayoutFormatOptions(0), metrics: metrics, views: views)
v2Constraints = NSLayoutConstraint.constraintsWithVisualFormat("V:|[view2(screenHeight)]", options: NSLayoutFormatOptions(0), metrics: metrics, views: views)

view.addConstraints(h1Constraints!)
view.addConstraints(v1Constraints!)
view.addConstraints(v2Constraints!)

【问题讨论】:

    标签: ios user-interface uiview autolayout


    【解决方案1】:

    是的,如果我正确理解您的要求,就可以实现。我推荐以下约束:

    • 将左视图的左侧与屏幕/超级视图的左侧对齐
    • 将右视图的右侧对齐到屏幕/超级视图的右侧
    • 将左视图的右侧与右视图的左侧对齐。
    • 为左视图的宽度添加约束

    然后,您可以更改最后一个约束的常量值,一切都应该按预期运行。

    请注意,我从未尝试过通过代码创建约束,只使用 IB - 但这是我在那里做的方式。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多