Swift - 具有零高度约束的UIView - 错误

问题描述:

我有UIView有高度限制。我想隐藏这个观点,所以我设置高度约束恒为0。Swift - 具有零高度约束的UIView - 错误

我设置的约束在里面的代码扩展UIView

_height = self.heightAnchor.constraint(equalToConstant: 50) 

NSLayoutConstraint.activate([ 

     _closeBtn.leadingAnchor.constraint(equalTo: self.leadingAnchor, constant: 5), 
     _closeBtn.topAnchor.constraint(equalTo: self.topAnchor, constant: 10), 
     _closeBtn.heightAnchor.constraint(equalTo: _centerLabel.heightAnchor), 
     _closeBtn.widthAnchor.constraint(equalTo: _closeBtn.heightAnchor), 

     _centerLabel.topAnchor.constraint(equalTo: self.topAnchor, constant: 10), 
     _centerLabel.bottomAnchor.constraint(equalTo: self.bottomAnchor, constant: -5), 
     _centerLabel.leadingAnchor.constraint(equalTo: _closeBtn.trailingAnchor), 
     _centerLabel.trailingAnchor.constraint(equalTo: self.trailingAnchor, constant: -16), 

     _height 
    ]) 

现在,如果我改变_height.constant = 0,我得到这个错误:

[LayoutConstraints] Unable to simultaneously satisfy constraints. 
    Probably at least one of the constraints in the following list is one you don't want. 
    Try this: 
     (1) look at each constraint and try to figure out which you don't expect; 
     (2) find the code that added the unwanted constraint or constraints and fix it. 
(
    "<NSLayoutConstraint:0x146a374c0 UIButton:0x147615b00'X'.width == UIButton:0x147615b00'X'.height (active)>", 
    "<NSLayoutConstraint:0x146a37530 UIButton:0x147615b00'X'.height == UILabel:0x147615e80.height (active)>", 
    "<NSLayoutConstraint:0x146a37450 V:|-(20)-[UILabel:0x147615e80] (active, names: '|':InternetConnectionInfoView:0x14742f600)>", 
    "<NSLayoutConstraint:0x146a373e0 UILabel:0x147615e80.bottom == InternetConnectionInfoView:0x14742f600.bottom - 5 (active)>", 
    "<NSLayoutConstraint:0x146a37680 InternetConnectionInfoView:0x14742f600.height == 0 (active)>" 
) 

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x146a374c0 UIButton:0x147615b00'X'.width == UIButton:0x147615b00'X'.height (active)> 

Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger. 
The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKit/UIView.h> may also be helpful. 

[LayoutConstraints] Unable to simultaneously satisfy constraints. 
    Probably at least one of the constraints in the following list is one you don't want. 
    Try this: 
     (1) look at each constraint and try to figure out which you don't expect; 
     (2) find the code that added the unwanted constraint or constraints and fix it. 
(
    "<NSLayoutConstraint:0x146a37530 UIButton:0x147615b00'X'.height == UILabel:0x147615e80.height (active)>", 
    "<NSLayoutConstraint:0x146a37450 V:|-(20)-[UILabel:0x147615e80] (active, names: '|':InternetConnectionInfoView:0x14742f600)>", 
    "<NSLayoutConstraint:0x146a373e0 UILabel:0x147615e80.bottom == InternetConnectionInfoView:0x14742f600.bottom - 5 (active)>", 
    "<NSLayoutConstraint:0x146a37680 InternetConnectionInfoView:0x14742f600.height == 0 (active)>" 
) 

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x146a373e0 UILabel:0x147615e80.bottom == InternetConnectionInfoView:0x14742f600.bottom - 5 (active)> 

Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger. 
The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKit/UIView.h> may also be helpful. 

我怀疑,这是来自顶部和底部的锚被设置为常量值。我试图使用greaterThanOrEual/lessThanOrEqual,但它破坏了布局。

如何解决这个问题(比如隐藏UIView)?我无法设置isHidden,因为其他UIViews被锚定到这个视图的底部,他们需要在隐藏时移动。

+0

我发现将UIView的高度设置为0也意味着您需要将子视图isHidden设置为true。你尝试过吗?编辑:我有一个视图,是一个滑动滑动菜单。它的动画效果很好 - 只需为子视图设置“isHidden”,然后将主视图的高度设置为0,然后为其设置动画效果。 – dfd

+0

@dfd不工作,同样的错误 –

+0

更改其中一个约束的优先级为999. – Sulthan

这是一个约束冲突,考虑减少约束优先级可以帮助你解决这个问题。

let closeBtnTopAnchor = _closeBtn.topAnchor.constraint(greaterThanOrEqualTo: self.topAnchor) 
let closeBtnTopAnchorWithLowPriority = _closeBtn.topAnchor.constraint(equalTo: self.topAnchor, constant: 10) 
closeBtnTopAnchorWithLowPriority.priority = UILayoutPriorityDefaultHigh 

let centerLabelTopAnchor = _centerLabel.topAnchor.constraint(greaterThanOrEqualTo: self.topAnchor) 
let centerLabelTopAnchorWithLowPriority = _centerLabel.topAnchor.constraint(equalTo: self.topAnchor, constant: 10) 
centerLabelTopAnchorWithLowPriority.priority = UILayoutPriorityDefaultHigh 

let centerLabelBottomAnchor = _centerLabel.bottomAnchor.constraint(lessThanOrEqualTo: self.bottomAnchor) 
let centerLabelBottomAnchorWithLowPriority = _centerLabel.bottomAnchor.constraint(equalTo: self.bottomAnchor, constant: -5) 
centerLabelBottomAnchorWithLowPriority.priority = UILayoutPriorityDefaultHigh 

NSLayoutConstraint.activate([ 

    _closeBtn.leadingAnchor.constraint(equalTo: self.leadingAnchor, constant: 5), 
    closeBtnTopAnchor, 
    closeBtnTopAnchorWithLowPriority, 

    _closeBtn.heightAnchor.constraint(equalTo: _centerLabel.heightAnchor), 
    _closeBtn.widthAnchor.constraint(equalTo: _closeBtn.heightAnchor), 

    centerLabelTopAnchor, 
    centerLabelTopAnchorWithLowPriority, 
    centerLabelBottomAnchor, 
    centerLabelBottomAnchorWithLowPriority, 
    _centerLabel.leadingAnchor.constraint(equalTo: _closeBtn.trailingAnchor), 
    _centerLabel.trailingAnchor.constraint(equalTo: self.trailingAnchor, constant: -16), 

    _height 
    ]) 

如果隐藏UIView对于您来说已经足够了,那么将它的alpha设置为0怎么样?

+0

它不会移动视图,即锚点取决于隐藏视图的高度。 –

+0

哦,我明白了,那么是否可以在“UIStackView”中使用这些视图?我遇到过这种情况只有一次,并使用它解决了我的问题。 – Mango

+0

如果不是,那么在将其设置为0时根据高度调整这些相关约束应该可行,但我认为这可能是一种不好的做法。 – Mango