2017-08-22 29 views
1

後,我在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,但不明白如何使用它,或者它甚至可以幫助我。

回答

1

我認爲這應該幫助:

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

現在每次設備方向的變化,它會重新計算約束和必要時進行調整

+0

但我想改變約束的價值,因爲你可以請參閱頂部和底部約束在橫向上沒有相同的值 –

+0

現在將您的代碼寫入函數,並在方向更改時調用該函數,而不是setNeedsUpdateConstraints()。但我認爲在這種情況下你必須刪除子視圖並重新添加它們。 –

+0

您是否需要以編程方式添加視圖?如果您將其添加到Interface Builder中,則可以硬編碼約束,您可以從中創建IBOutlet並輕鬆修改它們 –

0

首先,爲約束創建類級別的變量/屬性。然後在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