2016-09-15 74 views
0

我與coustom試圖限制如何解決無法同時滿足的約束

MenuBar類:

import UIKit 

class ManuBar: UIView { 
    override init(frame: CGRect) { 
     super.init(frame: frame) 
     backgroundColor = UIColor.blueColor() 
    } 

    required init?(coder aDecoder: NSCoder) { 
     fatalError("init(coder:) has not been implemented") 
    } 

} 

extension UIView { 
    func addConstraintsWithFormat(format: String, views: UIView...) { 
     var viewsDictionary = [String: UIView]() 
     for (index, view) in views.enumerate() { 
      let key = "v\(index)" 
      view.translatesAutoresizingMaskIntoConstraints = false 
      viewsDictionary[key] = view 
     } 

     addConstraints(NSLayoutConstraint.constraintsWithVisualFormat(format, options: NSLayoutFormatOptions(), metrics: nil, views: viewsDictionary)) 
    } 
} 

視圖控制器:

import UIKit 

    class ViewController: UIViewController { 

     override func viewDidLoad() { 
      super.viewDidLoad() 
      // Do any additional setup after loading the view, typically from a nib. 


      setupManuBar(); 

     } 

     let menuBar : ManuBar = { 
      let mb = ManuBar() 
      return mb 
     }() 

     private func setupManuBar(){ 

      view.addSubview(menuBar) 

      view.addConstraintsWithFormat("H:|[v0]|",views : menuBar) 
      view.addConstraintsWithFormat("V:|-16-[v0(40)]|",views : menuBar) 
     } 


    } 

enter image description here

無法同時滿足約束條件。
以下列表中的至少一個約束可能是您不想要的約束之一。
試試這個: (1)看看每個約束,並試圖找出你不期望的;
(2)發現,增加了不必要的約束或

constraints and fix it. 
(
    "<NSLayoutConstraint:0x7ff891d27c70 V:|-(16)-[Tab_Menu_Bar_Programmatically.ManuBar:0x7ff891d19f30] (Names: '|':UIView:0x7ff891d1b570)>", 
    "<NSLayoutConstraint:0x7ff891d27f40 V:[Tab_Menu_Bar_Programmatically.ManuBar:0x7ff891d19f30(40)]>", 
    "<NSLayoutConstraint:0x7ff891d0fc50 V:[Tab_Menu_Bar_Programmatically.ManuBar:0x7ff891d19f30]-(0)-| (Names: '|':UIView:0x7ff891d1b570)>", 
    "<NSLayoutConstraint:0x7ff891d1c8e0 'UIView-Encapsulated-Layout-Height' V:[UIView:0x7ff891d1b570(736)]>" 
) 

將嘗試如果打破約束

恢復的代碼你需要更多的信息,讓我知道

+0

請發表你的約束截圖你的問題。如果你不知道如何做到這一點,請告訴我。 –

+0

@DanLevy更新我的代碼 –

回答

1

你忘視圖view.translatesAutoresizingMaskIntoConstraints = false,因此要設置在電池,而不是對個人意見translatesAutoresizingMaskIntoConstraints。

更改for循環

for (index, view) in views.enumerate(){ 
       let key = "v\(index)" 
       view.translatesAutoresizingMaskIntoConstraints = false 
       viewsDictionry[key] = view 

      } 

我還要加上懶惰關鍵詞看lazy loading的意見。

更新:

您顯著改變你的代碼雖然。我測試了你的第一個例子,它工作。你的問題現在是:view.addConstraintsWithFormat("V:|-16-[v0(40)]|",views : menuBar)你基本上設置菜單欄的高度兩次。您將它設置爲固定高度,但是您也可以根據超級景觀來使其伸展。 像素頂部空間+ 0像素在底部。取下|

像這樣:

view.addConstraintsWithFormat("H:|[v0]|",views : menuBar) 
view.addConstraintsWithFormat("V:|-16-[v0(40)]",views : menuBar) 
+0

無法正常工作並更新我的代碼 –

+0

是的,重大更改,對不起!當我刪除|在結束時然後拋出異常 –

+0

是的工作謝謝 –

0

我會考慮爲縮略圖圖像添加高度限制。查看不完全滿足的垂直或水平約束,並確保每個視圖具有定義的大小和位置。如果您使用佈局文件,還要確保沒有衝突的約束。

相關問題