2016-04-08 81 views
10

我試圖製作一個視圖,它將充當一種「面板」,連接到視圖控制器的右側。以編程方式創建綁定到視圖控制器邊界的約束

也就是說,它必然尾隨,頂部,父視圖控制器的底部邊緣,與300

但是固定寬度,我似乎無法得到它的權利,我無論是打破約束還是做一些事情xcode告訴我是非法的。

我在做什麼錯?

這裏是控制器

let myView = UIView() 
    view.backgroundColor = UIColor.redColor() 
    self.view.addSubview(view) 
    let topConstraint = NSLayoutConstraint(item: myView, 
              attribute: .Top, 
              relatedBy: .Equal, 
              toItem: self.topLayoutGuide, 
              attribute: .Bottom, 
              multiplier: 1, 
              constant: 0) 

    let trailingConstraint = NSLayoutConstraint(item: self.view, 
               attribute: .TrailingMargin, 
               relatedBy: .Equal, 
               toItem: myView, 
               attribute: .Trailing, 
               multiplier: 1, 
               constant: 0) 

    let bottomConstraint = NSLayoutConstraint(item: self.bottomLayoutGuide, 
               attribute: .Top, 
               relatedBy: .Equal, 
               toItem: myView, 
               attribute: .Bottom, 
               multiplier: 1, 
               constant: 0) 

    let widthConstraint = NSLayoutConstraint(item: myView, 
              attribute: .Width, 
              relatedBy: .Equal, 
              toItem: nil, 
              attribute: .NotAnAttribute, 
              multiplier: 1, 
              constant: 300) 

    self.view.addConstraints([trailingConstraint]) 
    view.addConstraints([topConstraint, bottomConstraint, widthConstraint]) 
+1

爲什麼你不使用Visual Format Language? ''H:[panel(300)] |'和'「V:| [toplayout] [panel] [botlayout] |」'應該足夠了 – Eendje

回答

38

其實在你的代碼的問題是,你D編號沒有設置translatesAutoresizingMaskIntoConstraintsmyviewfalse,只要你想使用自動佈局約束,那麼你必須將translatesAutoresizingMaskIntoConstraints的視圖設置爲false。 另一個問題是,您不要在self.view上添加myview我已更新您的代碼並且它的工作正常根據您的約束。

把下面的代碼放到你的ViewController中。

let myView = UIView() 
myView.backgroundColor = UIColor.redColor() 
self.view.addSubview(myView) 
myView.translatesAutoresizingMaskIntoConstraints = false 

view.addConstraint(NSLayoutConstraint(item: myView, attribute: .Top, relatedBy: .Equal, toItem: self.topLayoutGuide, attribute: .Bottom, multiplier: 1, constant: 0)) 
view.addConstraint(NSLayoutConstraint(item: myView, attribute: .Bottom, relatedBy: .Equal, toItem: self.bottomLayoutGuide, attribute:.Top, multiplier: 1, constant: 20)) 

view.addConstraint(NSLayoutConstraint(item: myView, attribute: .Width, relatedBy: .Equal, toItem: nil, attribute: .NotAnAttribute,multiplier: 1, constant: 300)) 
view.addConstraint(NSLayoutConstraint(item: myView, attribute: .TrailingMargin, relatedBy: .Equal, toItem: view, attribute: .TrailingMargin, multiplier: 1, constant: 0)) 
+1

如果你想以更容易的方式通過編程方式添加約束, ://github.com/keshavvishwkarma/KVConstraintExtensionsMaster。 –

+0

如果你真的喜歡我的答案,那麼你也會投票。 –

0

的代碼似乎是在你的代碼中的一些不確定性,要創建一個UIView作爲MyView的,但加入以self.view,甚至也制約查看本身。所以糾正你的代碼並用myView替換視圖。 其次setTranslayesAutoresizingMaskIntoConstraints爲false。 然後將所有約束添加到self.view。這應該可以解決你的問題。

myView.setTranslatesAutoresizingMaskIntoConstraints(false) 
self.view.addConstraints([trailingConstraint, bottomConstraint, widthConstraint]) 

VFL也是一種更好和乾淨的方法。它實際上給出瞭如何設置約束的可視化。

5

在上面的示例代碼中,好像在幾個地方混合了viewmyView。無論如何,widthConstraint應該被添加到myViewtopConstrainttrailingConstraintbottomConstraint應該被添加到self.view。其原因是必須將約束添加到最近的超級視圖祖先中,該超級視圖祖先列出了約束中涉及的兩個視圖。在將子視圖屬性約束到其父視圖上的屬性的情況下,必須將約束添加到父視圖中,因爲它將自身和子視圖都佈局。如果你在兩個兄弟視圖之間有一個約束,約束將被添加到他們的父視圖中,因爲它是最接近兩個視圖的祖先。

如果您能夠定位iOS 9.0及更高版本,那麼使用新的NSLayoutAnchor和NSLayoutDimension API來創建這些類型的約束條件會更簡潔更容易。它還提供了嚴格的類型檢查,編譯器可以驗證正確性。有了這些新的API,你的示例代碼會簡直成了:

let myView = UIView() 
myView.backgroundColor = UIColor.redColor() 
self.view.addSubview(myView) 

let margins = self.view.layoutMarginsGuide 
myView.trailingAnchor.constraintEqualToAnchor(margins.trailingAnchor).active = true 
myView.topAnchor.constraintEqualToAnchor(margins.topAnchor).active = true 
myView.bottomAnchor.constraintEqualToAnchor(margins.bottomAnchor).active = true 
myView.widthAnchor.constraintEqualToConstant(300.0).active = true 

沒有必要的限制明確添加到右側視圖等,您可以在此處詳細瞭解創建約束這種方法:

https://developer.apple.com/library/ios/documentation/AppKit/Reference/NSLayoutAnchor_ClassReference/

這裏:

https://developer.apple.com/library/ios/documentation/AppKit/Reference/NSLayoutDimension_ClassReference/

相關問題