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

Posted

技术标签:

【中文标题】如何解决无法同时满足约束【英文标题】:How to solve Unable to simultaneously satisfy constraints 【发布时间】:2016-09-15 17:36:37 【问题描述】:

我正在尝试自定义约束

菜单栏类:

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)
        


    

无法同时满足约束。 以下列表中的至少一个约束可能是您不想要的。 试试这个: (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)]>"
)

将尝试通过打破约束来恢复

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

【问题讨论】:

请张贴您对问题的限制的屏幕截图。如果您不知道该怎么做,请告诉我。 @DanLevy 更新我的代码 【参考方案1】:

您忘记了view.translatesAutoresizingMaskIntoConstraints = false 中的view,因此您在单元格上而不是在单个视图上设置 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)

【讨论】:

是的,发生了重大变化,对此感到抱歉!当我删除 |最后抛出异常【参考方案2】:

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

【讨论】:

以上是关于如何解决无法同时满足约束的主要内容,如果未能解决你的问题,请参考以下文章

无法同时满足约束 - Swift

无法同时满足约束 - LayoutConstraints

iOS:无法同时满足约束

无法同时满足约束。虽然没有定义重复/不需要的约束

关闭:“无法同时满足约束”[重复]

无法同时满足 UITextField 上的约束