在代码中更改大小分类约束的常量,但它会恢复为情节提要值
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
【讨论】:
以上是关于在代码中更改大小分类约束的常量,但它会恢复为情节提要值的主要内容,如果未能解决你的问题,请参考以下文章