如何解决无法同时满足约束

时间:2016-09-15 17:36:37

标签: ios swift xcode

我正在尝试使用coustom约束

菜单栏课程:

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)]>"
)

将尝试通过违反约束来恢复

如果您需要更多信息,请告诉我

2 个答案:

答案 0 :(得分:1)

您忘记了view.translatesAutoresizingMaskIntoConstraints = false中的查看,因此您在单元格而不是单个视图上设置了translatesAutoresizingMaskIntoConstraints。

将for循环更改为

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

            }

我还会通过添加lazy关键字来查看lazy loading个视图。

更新:

但是你显着改变了你的代码。我测试了你的第一个例子,它起作用了。你现在的问题是:view.addConstraintsWithFormat("V:|-16-[v0(40)]|",views : menuBar)你基本上设定了两次菜单栏的高度。你将它设置为 40 的固定高度,但你也要告诉它根据superview进行拉伸。 16 像素顶部空间+ 0 底部像素。最后删除|

像这样:

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

答案 1 :(得分:0)

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