【发布时间】: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