在代码中更改大小分类约束的常量,但它会恢复为情节提要值

Posted

技术标签:

【中文标题】在代码中更改大小分类约束的常量,但它会恢复为情节提要值【英文标题】:Changing constant of a size-classed constraint within code but it reverts back to storyboard value 【发布时间】:2017-07-19 22:03:55 【问题描述】:

我遇到了使用尺寸类的约束的问题。

在情节提要中,我将视图的宽度约束设置为紧凑宽度和常规宽度大小类的不同值。在视图控制器中,我有一个对该约束的引用,我在 viewDidLoad() 中将其常量设置为零。

我遇到的问题是约束的常量恢复为情节提要值,除非在调用 viewDidAppear() 之后。在那之后,约束常量保持在我在源代码中设置的任何值。

即使在viewWillAppear() 内将约束的常量设置为零,仍会导致约束恢复为情节提要值。

我可以从情节提要中删除约束并在代码中执行此操作,但我想知道是否有人对为什么会发生这种情况有任何其他想法,以及是否有不需要删除约束的修复故事板。

【问题讨论】:

听起来好像和视图生命周期有关。您是否尝试过在以后的覆盖中对其进行编码?也许viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator)?如果您不使用 IB,这就是您将针对尺寸类进行编码的覆盖。 【参考方案1】:

我猜想自动布局使用默认约束布局所有内容,然后在视图出现之前再次布局所有内容,考虑大小类。这就是约束“恢复”的原因——它实际上只是第一次被设置为尺寸等级的正确值。

无论如何,在修改约束之前在viewDidLoad() 中调用view.layoutIfNeeded() 解决了这个问题。

【讨论】:

【参考方案2】:

这是一种预期行为,因为在 viewDidLoad() 中不知道视图宽度

查看此相关答案https://***.com/a/16421170/7626803

【讨论】:

以上是关于在代码中更改大小分类约束的常量,但它会恢复为情节提要值的主要内容,如果未能解决你的问题,请参考以下文章

根据情节提要中的设备边界而变化的约束

如何在 xib 文件中为约束设置常量

快照套件。替换情节提要约束

Objective-C:动画高度约束更改不起作用

使用自动布局时标签不会调整大小,情节提要中的约束

AutoLayout常量更改不动画