更改约束值旋转

问题描述:

后,我在viewDidLoad()更改约束值旋转

let top = isLandscape ? 30.0 : 5.0 
let bottom = isLandscape ? 60.0 : 20.0 

let topConstraint = NSLayoutConstraint(item: mySubview, attribute: .top, relatedBy: .equal, toItem: self.view, attribute: .top, multiplier: 1, constant: top) 
let bottomConstraint = NSLayoutConstraint(item: mySubview, attribute: .bottom, relatedBy: .equal, toItem: self.view, attribute: .bottom, multiplier: 1, constant: bottom) 
let leadingConstraint = NSLayoutConstraint(item: mySubview, attribute: .leading, relatedBy: .equal, toItem: self.view, attribute: .leading, multiplier: 1, constant: 50.0) 
let trailingConstraint = NSLayoutConstraint(item: mySubview, attribute: .trailing, relatedBy: .equal, toItem: self.view, attribute: .trailing, multiplier: 1, constant: 50.0) 

mySubview.translatesAutoresizingMaskIntoConstraints = false 
self.view.addSubview(mySubview) 
self.view.addConstraints([topConstraint, bottomConstraint, leadingConstraint, trailingConstraint]) 

我怎样才能应用相应的constaints设备方向更改时以编程方式添加约束视图与此代码?我阅读了setNeedsUpdateConstraints,但不明白如何使用它,或者它甚至可以帮助我。

我认为这应该帮助:

override func willAnimateRotation(to toInterfaceOrientation: UIInterfaceOrientation, duration: TimeInterval) { 
    self.view.setNeedsUpdateConstraints() 
} 

现在每次设备方向的变化,它会重新计算约束和必要时进行调整

+0

但我想改变约束的价值,因为你可以请参阅顶部和底部约束在横向上没有相同的值 –

+0

现在将您的代码写入函数,并在方向更改时调用该函数,而不是setNeedsUpdateConstraints()。但我认为在这种情况下你必须删除子视图并重新添加它们。 –

+0

您是否需要以编程方式添加视图?如果您将其添加到Interface Builder中,则可以硬编码约束,您可以从中创建IBOutlet并轻松修改它们 –

首先,为约束创建类级别的变量/属性。然后在viewDidLoad中,设置这些限制,而不是建立新的:

class MyViewController: UIViewController { 

    var topConstraint = NSLayoutConstraint() 
    var bottomConstraint = NSLayoutConstraint() 
    var leadingConstraint = NSLayoutConstraint() 
    var trailingConstraint = NSLayoutConstraint() 
    var mySubView = UIView() 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     let top = isLandscape ? 30.0 : 5.0 
     let bottom = isLandscape ? 60.0 : 20.0 

     topConstraint = NSLayoutConstraint(item: mySubView, attribute: .top, relatedBy: .equal, toItem: self.view, attribute: .top, multiplier: 1, constant: top) 
     bottomConstraint = NSLayoutConstraint(item: mySubView, attribute: .bottom, relatedBy: .equal, toItem: self.view, attribute: .bottom, multiplier: 1, constant: bottom) 

     leadingConstraint = NSLayoutConstraint(item: mySubview, attribute: .leading, relatedBy: .equal, toItem: self.view, attribute: .leading, multiplier: 1, constant: 50.0) 
     trailingConstraint = NSLayoutConstraint(item: mySubview, attribute: .trailing, relatedBy: .equal, toItem: self.view, attribute: .trailing, multiplier: 1, constant: 50.0) 

     mySubview.translatesAutoresizingMaskIntoConstraints = false 
     self.view.addSubview(mySubview) 
     self.view.addConstraints([topConstraint, bottomConstraint, leadingConstraint, trailingConstraint]) 

    } 
} 

然后,当你想改变的值:

let top = isLandscape ? 30.0 : 5.0 
    let bottom = isLandscape ? 60.0 : 20.0 

    topConstraint.constant = top 
    bottomConstraint.constant = bottom