2016-09-15 51 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

我会考虑为缩略图图像添加高度限制。查看不完全满足的垂直或水平约束,并确保每个视图具有定义的大小和位置。如果您使用布局文件,还要确保没有冲突的约束。

相关问题