首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >“压缩”隐藏视图上的UIStackView“不能同时满足约束”

“压缩”隐藏视图上的UIStackView“不能同时满足约束”
EN

Stack Overflow用户
提问于 2015-09-06 20:54:05
回答 14查看 29.9K关注 0票数 101

当我的UIStackView“行”被压缩时,它们会抛出AutoLayout警告。但是,它们显示得很好,除了这类日志之外,没有什么是错误的:

不能同时满足约束。可能下面列表中至少有一个约束是您不想要的。尝试如下:(1)查看每个约束,并尝试找出您不期望的;(2)找到添加了不需要的约束的代码并修复它。(注意:如果您看到的是您不了解的NSAutoresizingMaskLayoutConstraints,请参阅UIView property translatesAutoresizingMaskIntoConstraints的文档)(

因此,我还不知道如何解决这个问题,但它似乎除了恼人之外,并没有破坏任何东西。

有人知道怎么解决吗?有趣的是,布局约束经常被标记为'UISV-hiding',,可能它应该忽略子视图或实例中的高度最小值?

EN

回答 14

Stack Overflow用户

回答已采纳

发布于 2015-10-01 11:02:37

您之所以会遇到这个问题,是因为当将UIStackView内部的子视图设置为隐藏时,它首先会将其高度限制为零,以便将其动画化。

我得到了以下错误:

代码语言:javascript
运行
复制
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约束可以获得优先级。

票数 212
EN

Stack Overflow用户

发布于 2016-06-27 23:17:48

我遇到了一个类似的问题,很难解决。在我的例子中,我在堆栈视图中嵌入了一个堆栈视图。内部UIStackView有两个标签和指定的非零间距。

当调用addArrangedSubview()时,它将自动创建类似于以下内容的约束:

代码语言:javascript
运行
复制
V:|[innerStackView]|              | = outerStackView

  V:|[label1]-(2)-[label2]|       | = innerStackView

现在,当您试图隐藏innerStackView时,您会得到一个模糊的约束警告。

为了理解为什么,让我们首先看看为什么当innerStackView.spacing等于0时不会发生这种情况。当你打电话给innerStackView.hidden = true时,“利亚尼克斯”是正确的.outerStackView将神奇地拦截此调用,并创建一个具有优先级1000 (必需)的0高度UISV-隐藏约束。这大概是为了允许堆栈视图中的元素在视图之外被动画化,以防隐藏代码在UIView.animationWithDuration()块中被调用。不幸的是,似乎没有办法阻止添加此约束。然而,您不会得到“无法同时满足约束”(USSC)警告,因为会发生以下情况:

  1. 标签1的高度设置为0。
  2. 两个标签之间的间距已经定义为0。
  3. 标签2的高度设置为0。
  4. innerStackView的高度设置为0

很明显,这4个约束是可以满足的。堆栈视图简单地将所有内容平滑到0高度像素中.

现在回到buggy示例,如果我们将spacing设置为2,那么我们现在有了以下约束:

  1. 标签1的高度设置为0。
  2. 两个标签之间的间距由堆栈视图自动创建为2像素,优先级为1000 .
  3. 标签2的高度设置为0。
  4. innerStackView的高度设置为0

堆栈视图不能同时高0像素,其内容也不能高2像素。这些限制不能得到满足。

注意:您可以通过一个简单的例子看到这种行为。只需将UIView添加到堆栈视图作为排列的子视图即可。然后在具有1000个优先级的UIView上设置一个高度约束。现在试着叫我藏起来。

注意:无论出于什么原因,只有当我的堆栈视图是UICollectionViewCell或UITableViewCell的子视图时,才会发生这种情况。但是,在隐藏内部堆栈视图之后,仍然可以在下一个运行循环中调用innerStackView.systemLayoutSizeFittingSize(UILayoutFittingCompressedSize),从而在单元格之外再现此行为。

注意:即使您尝试在UIView.performWithoutAnimations中执行代码,堆栈视图仍然会添加一个0高度约束,这将导致USSC警告。

这一问题至少有3种解决办法:

  1. 在堆栈视图中隐藏任何元素之前,先检查它是否是堆栈视图,如果是,将spacing 更改为0。很烦人,因为每当您再次显示内容时,都需要反转进程(并记住原始间距)。
  2. 调用removeFromSuperview**.** ,而不是在堆栈视图中隐藏元素--这更让人讨厌,因为当您反转流程时,您需要记住在哪里插入删除的项。您可以只调用removeArrangedSubview进行优化,然后隐藏,但是仍然需要进行大量的簿记工作。
  3. spacing**)嵌套堆栈视图(在UIView中具有非零)。指定至少一个约束为非必需优先级(999或以下).**,这是最好的解决方案,因为您不需要做任何簿记。在我的示例中,我在堆栈视图和包装视图之间创建了顶部、前导和尾随约束,然后从堆栈视图底部创建了999约束到包装视图。这样,当外部堆栈视图创建零高度约束时,999约束就会被打破,您将不会看到USSC警告。(注意:这类似于false的解决方案)

总之,您得到这种行为的原因是:

  1. 当将托管子视图添加到堆栈视图时,Apple会自动为您创建1000个优先级约束。
  2. 当您隐藏堆栈视图的子视图时,Apple会自动为您创建一个0高度约束。

如果苹果(1)允许您指定约束的优先级(特别是间隔),或者(2)允许您选择退出自动UISV隐藏约束,则此问题将很容易解决。

票数 57
EN

Stack Overflow用户

发布于 2015-09-06 21:42:25

在大多数情况下,可以通过降低约束优先级来解决此错误,以消除冲突。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32428210

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档