当我的UIStackView“行”被压缩时,它们会抛出AutoLayout警告。但是,它们显示得很好,除了这类日志之外,没有什么是错误的:
不能同时满足约束。可能下面列表中至少有一个约束是您不想要的。尝试如下:(1)查看每个约束,并尝试找出您不期望的;(2)找到添加了不需要的约束的代码并修复它。(注意:如果您看到的是您不了解的
NSAutoresizingMaskLayoutConstraints,请参阅UIViewpropertytranslatesAutoresizingMaskIntoConstraints的文档)(
因此,我还不知道如何解决这个问题,但它似乎除了恼人之外,并没有破坏任何东西。
有人知道怎么解决吗?有趣的是,布局约束经常被标记为'UISV-hiding',,可能它应该忽略子视图或实例中的高度最小值?
发布于 2015-10-01 11:02:37
您之所以会遇到这个问题,是因为当将UIStackView内部的子视图设置为隐藏时,它首先会将其高度限制为零,以便将其动画化。
我得到了以下错误:
2015-10-01 11:45:13.732 <redacted>[64455:6368084] 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. (Note: If you're seeing NSAutoresizingMaskLayoutConstraints that you don't understand, refer to the documentation for the UIView property translatesAutoresizingMaskIntoConstraints)
(
"<NSLayoutConstraint:0x7f7f5be18c80 V:[UISegmentedControl:0x7f7f5bec4180]-(8)-| (Names: '|':UIView:0x7f7f5be69d30 )>",
"<NSLayoutConstraint:0x7f7f5be508d0 V:|-(8)-[UISegmentedControl:0x7f7f5bec4180] (Names: '|':UIView:0x7f7f5be69d30 )>",
"<NSLayoutConstraint:0x7f7f5bdfbda0 'UISV-hiding' V:[UIView:0x7f7f5be69d30(0)]>"
)
Will attempt to recover by breaking constraint
<NSLayoutConstraint:0x7f7f5be18c80 V:[UISegmentedControl:0x7f7f5bec4180]-(8)-| (Names: '|':UIView:0x7f7f5be69d30 )>
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.我想要做的是,在我的UIView中放置一个UIStackView,它在每条边界上都包含一个由8个UISegmentedControl嵌入的UISegmentedControl。
当我将它设置为隐藏时,它会尝试将容器视图约束为零高度,但是由于我有一组自上而下的约束,所以会出现冲突。
为了解决这个问题,我将我的8pt顶部的底部约束优先级从1000更改为999,这样如果需要的话,UISV-hiding约束可以获得优先级。
发布于 2016-06-27 23:17:48
我遇到了一个类似的问题,很难解决。在我的例子中,我在堆栈视图中嵌入了一个堆栈视图。内部UIStackView有两个标签和指定的非零间距。
当调用addArrangedSubview()时,它将自动创建类似于以下内容的约束:
V:|[innerStackView]| | = outerStackView
V:|[label1]-(2)-[label2]| | = innerStackView现在,当您试图隐藏innerStackView时,您会得到一个模糊的约束警告。
为了理解为什么,让我们首先看看为什么当innerStackView.spacing等于0时不会发生这种情况。当你打电话给innerStackView.hidden = true时,“利亚尼克斯”是正确的.outerStackView将神奇地拦截此调用,并创建一个具有优先级1000 (必需)的0高度UISV-隐藏约束。这大概是为了允许堆栈视图中的元素在视图之外被动画化,以防隐藏代码在UIView.animationWithDuration()块中被调用。不幸的是,似乎没有办法阻止添加此约束。然而,您不会得到“无法同时满足约束”(USSC)警告,因为会发生以下情况:
很明显,这4个约束是可以满足的。堆栈视图简单地将所有内容平滑到0高度像素中.
现在回到buggy示例,如果我们将spacing设置为2,那么我们现在有了以下约束:
堆栈视图不能同时高0像素,其内容也不能高2像素。这些限制不能得到满足。
注意:您可以通过一个简单的例子看到这种行为。只需将UIView添加到堆栈视图作为排列的子视图即可。然后在具有1000个优先级的UIView上设置一个高度约束。现在试着叫我藏起来。
注意:无论出于什么原因,只有当我的堆栈视图是UICollectionViewCell或UITableViewCell的子视图时,才会发生这种情况。但是,在隐藏内部堆栈视图之后,仍然可以在下一个运行循环中调用innerStackView.systemLayoutSizeFittingSize(UILayoutFittingCompressedSize),从而在单元格之外再现此行为。
注意:即使您尝试在UIView.performWithoutAnimations中执行代码,堆栈视图仍然会添加一个0高度约束,这将导致USSC警告。
这一问题至少有3种解决办法:
spacing 更改为0。很烦人,因为每当您再次显示内容时,都需要反转进程(并记住原始间距)。removeFromSuperview**.** ,而不是在堆栈视图中隐藏元素--这更让人讨厌,因为当您反转流程时,您需要记住在哪里插入删除的项。您可以只调用removeArrangedSubview进行优化,然后隐藏,但是仍然需要进行大量的簿记工作。spacing**)嵌套堆栈视图(在UIView中具有非零)。指定至少一个约束为非必需优先级(999或以下).**,这是最好的解决方案,因为您不需要做任何簿记。在我的示例中,我在堆栈视图和包装视图之间创建了顶部、前导和尾随约束,然后从堆栈视图底部创建了999约束到包装视图。这样,当外部堆栈视图创建零高度约束时,999约束就会被打破,您将不会看到USSC警告。(注意:这类似于false的解决方案)总之,您得到这种行为的原因是:
如果苹果(1)允许您指定约束的优先级(特别是间隔),或者(2)允许您选择退出自动UISV隐藏约束,则此问题将很容易解决。
发布于 2015-09-06 21:42:25
在大多数情况下,可以通过降低约束优先级来解决此错误,以消除冲突。
https://stackoverflow.com/questions/32428210
复制相似问题