在特定条件下切换约束

Posted

技术标签:

【中文标题】在特定条件下切换约束【英文标题】:Toggling a constraint under a certain condition 【发布时间】:2017-04-04 21:06:27 【问题描述】:

设置:我设计了一个UIButton,底部constraint X,优先级999。除了这个constraint之外,UIButton还有另一个constraint Y,优先级1000,但这个标记为@ 987654326@.

Y 与我的UIViewController 中的@IBOutlet 相关联,具有强引用。

viewDidLoad() 上:如果给定条件恰好为真,我通过执行Y.isActive = true 激活constraint Y,然后执行view.layoutIfNeeded(),如果需要,它最终会调用updateConstraints()。如果条件为假,我什么也不做。

我的期望:当条件为真时,我希望视图将 Y constraint 应用于按钮并删除 X。当条件为假时,我希望 UIButton 只有 constraint X。

结果:似乎constraint Y 根本没有被应用,即使满足条件。

我会很感激对此的任何想法,这对我来说似乎应该可行。

谢谢。

附:我使用 swift,但我不介意提供的答案是否在 Obj-C 中。

【问题讨论】:

如果两个约束之间的所有变化都是constant,那么只需使用一个约束并进行更改。 尝试在viewDidLayoutSubviews内部调用这个 viewDidLayoutSubviews 可能会起作用,因为它会覆盖约束发生的任何事情并在最后执行,但是,这似乎不是解决为什么这不起作用的解决方案。 【参考方案1】:

在使用 IB 时似乎存在一个错误,将约束的属性设置为已卸载并不总是会像“非活动”一样正常工作,而是稍后在激活/停用给定约束时会产生问题。

作为一种解决方法,始终将约束标记为已安装,但对于那些需要在加载时处于非活动状态的约束,请转到身份检查器/用户定义的运行时属性并将“活动”作为布尔值添加为 false(未选中)

在这里找到解决方案:https://***.com/a/33079428/691868

【讨论】:

以上是关于在特定条件下切换约束的主要内容,如果未能解决你的问题,请参考以下文章

SQLServer约束介绍

SQLServer约束介绍

使用自动布局缩放垂直约束

Postgres 9.2 - 添加条件约束检查

PCL:ConditionRemoval 条件滤波(坐标约束 | 强度约束)

切换自动布局约束 - 可能吗?