2014-11-01 56 views
1

我想在許多項目的視圖上對齊到CenterX。在swift中使用NSLayoutConstraint來對齊多個項目

1項此代碼的工作:

let control_constraint_ItemAlign = NSLayoutConstraint(item: emailField, attribute: NSLayoutAttribute.CenterX, relatedBy: NSLayoutRelation.Equal, toItem: self.view, attribute: NSLayoutAttribute.CenterX, multiplier: 1, constant: 0) 

,但我想嘗試這樣的代碼:

let control_constraint_ItemAlign = 
NSLayoutConstraint(item:[emailField,passwordField,loginButton], 
attribute: NSLayoutAttribute.CenterX, 
relatedBy: NSLayoutRelation.Equal, 
toItem: self.view, 
attribute: NSLayoutAttribute.CenterX, 
multiplier: 1, 
constant: 0) 

或唯一的解決辦法是寫每個項目一個約束?

+1

您可以使用'for'循環的類似的限制一堆。您還可以減少使用Visual Format Language編寫的約束條件數量。 – 2014-11-01 00:41:38

回答

2

您可以通過視圖循環:

for view in [emailField,passwordField,loginButton] { 
    let control_constraint_ItemAlign = 
    NSLayoutConstraint(item:view, 
    attribute: NSLayoutAttribute.CenterX, 
    relatedBy: NSLayoutRelation.Equal, 
    toItem: self.view, 
    attribute: NSLayoutAttribute.CenterX, 
    multiplier: 1, 
    constant: 0) 
    self.view.addConstraint(control_constraint_ItemAlign) 
} 

或者,您可以通過相應的選項,以視覺形式語言

+0

該解決方案工作正常,但只有1個VFL,我可以如何將這些項目與centerX對齊?只發現沒有VFL的代碼 – Patonz 2014-11-01 01:09:53

1

@Patonz - 我包括這個答案,因爲我看到了上的評論接受的答案是,我正在尋找一種涉及for-loop + VFL的解決方案。

如果我沒有弄錯,我認爲正確的做法是「讓它處於中心位置」,而不是試圖強迫它居中。

您可以使用一個循環列舉你的觀點字典,然後插的關鍵是:

let views = [ 
    "red": redView, 
    "blue": blueView, 
    "yellow": yellowView, 
] 

self.statsView.addConstraints(
    NSLayoutConstraint.constraintsWithVisualFormat(
    "V:|-2-[red(>=10)]-2-[blue(==red)]-2-[yellow(==red)]-2-|", options: nil, metrics: nil, views: views)) 

for (index, (key, val)) in enumerate(views) { 
    self.statsView.addConstraints(
    NSLayoutConstraint.constraintsWithVisualFormat(
     "H:|-60-[\(key)(>=100)]-60-|", options: nil, metrics: nil, views: views)) 
} 

通知的>=。只需設置一個最小值並讓自動佈局完成其工作(爲您擴展/填充剩餘空間)。但是,你可以簡單地刪除這些並達到同樣的效果:

self.statsView.addConstraints(
    NSLayoutConstraint.constraintsWithVisualFormat(
    "V:|-2-[red]-2-[blue(==red)]-2-[yellow(==red)]-2-|", options: nil, metrics: nil, views: views)) 

for (index, (key, val)) in enumerate(views) { 
    self.statsView.addConstraints(
    NSLayoutConstraint.constraintsWithVisualFormat(
     "H:|-60-[\(key)]-60-|", options: nil, metrics: nil, views: views)) 
} 

我用顏色直觀的瞭解,你可以把你的字典裏是這樣的:

let views = [ 
    "email": emailField, 
    "password": passwordField, 
    "login": loginButton 
] 

這裏有一個完整的示例的要點:https://gist.github.com/damionjn/cd6054c6cae770713615

而產生的代碼:http://cl.ly/image/0z0H2C230H3R