NSLayoutConstraint 激活/停用

Posted

技术标签:

【中文标题】NSLayoutConstraint 激活/停用【英文标题】:NSLayoutConstraint activate/deactivate 【发布时间】:2017-07-22 00:41:15 【问题描述】:

我只是想在 textViewDidBeginEditing 中停用约束并在 textViewDidEndEditing 中停用。

我的 NSLayoutConstraint 是一个出口。 textViewDidBeginEditing 中的停用有效,但随后 textViewDidEndEditing 上的重新激活发现约束为零。

我已经尝试使用 .isActive 实例值以及 NSLayoutConstraint.activate/deactivate 函数。

答案 我玩弄了 Vasil Hristov 的答案,但没有奏效,因为他只是建议 0 和 1000。来自文档:

优先级不能从非必需变为必需,或从必需变为非必需。如果将 OS X 中的 NSLayoutPriorityRequiredios 中的 UILayoutPriorityRequired 的优先级更改为较低的优先级,或者在将约束添加到视图后将较低的优先级更改为所需的优先级,则会引发异常。即使在视图上安装了约束之后,也允许从一个可选优先级更改为另一个可选优先级。

因此,我必须首先将 IB 中的优先级更改为其他内容(我选择了 750 - 高),然后在不需要时将其切换到 250,并创建了与第一个约束相冲突的第二个约束500 优先级(做其他事情),这让我得到了我想要的行为。

根据上面的文档,由于不需要高,我应该能够切换到 0,但这仍然导致崩溃,所以我一定是读错了。因此,我为什么要做第二个约束。

【问题讨论】:

【参考方案1】:

您可以尝试更改约束的优先级。 例如:

constraint.priority = 0;    // it's turn off
constraint.priority = 1000; // it's turn on

【讨论】:

> 优先级可能不会从非必需变为必需,或从必需变为非必需。如果 OS X 中的 NSLayoutPriorityRequired 或 iOS 中的 UILayoutPriorityRequired 的优先级更改为较低的优先级,或者在将约束添加到视图后将较低的优先级更改为所需的优先级,则会引发异常。即使在视图上安装了约束之后,也允许从一个可选优先级更改为另一个可选优先级。

以上是关于NSLayoutConstraint 激活/停用的主要内容,如果未能解决你的问题,请参考以下文章

如何激活以前停用的约束?

用函数停用在 viewdidload 中声明的 nslayoutconstraint

停用 NSLayoutConstraint iOS 7

可以重新激活 NSLayoutConstraint 吗?

NSLayoutConstraint 自行重新激活

在 `cellForRowAt` 中激活 NSLayoutConstraint 直到滚动后才会呈现