【问题标题】:Activating and Deactivating Constraints Not Updating View Frame激活和停用不更新视图框架的约束
【发布时间】:2018-12-17 14:14:09
【问题描述】:

我有一个包含标签和按钮的子视图,但是,并不总是需要该按钮。如果需要 Button,Label 需要显示在视图的顶部,按钮显示在视图的底部。如果不需要 Button,则需要在视图中间显示 Label。

为此,我修改了三个约束:

  1. 标签底部到按钮顶部等于 0。(约束 1)
  2. 标签底部到按钮顶部大于或等于 0(约束 3)
  3. 按钮高度(约束 3)

注意:标签有一个顶部约束,视图设置为 0,按钮有一个底部约束,视图设置为 0。这些保持不变。

注意:所有约束都设置为安装,并且在构建时按钮高度为 42

如果需要 Button,则卸载 Constraint1,并将 Constraint3 设置为 42。

如果不需要 Button,则安装 Constraint1 并将 Constraint3 设置为 0。

如您所见,这在情节提要上按预期工作。但是,在代码中,行为并没有体现出来。如果需要按钮,我试试这个:

constraint3.constant = 42
self.view.removeConstraint(constraint1)
self.view.updateConstraints

但我得到的结果不是预期的结果,就好像约束从未被删除:

我在情节提要中卸载了约束,它看起来是正确的,但是当我在代码中卸载约束时,它并没有...我的代码中有什么不正确/缺少的地方才能使其正常工作?

【问题讨论】:

  • 您希望视图的高度保持不变吗?或者如果不需要按钮,视图高度是否应该改变?
  • 视图的高度是恒定的。
  • 好的 - 您是否要从视图中删除该按钮?你想让标签垂直居中吗?还是您希望它填充视图的高度?
  • 并且...有点令人困惑...您的第三张图片是您希望在需要按钮时的外观吗,以及您的第二张图片是您想要的外观吗? 没有按钮?所以你的第一张图片不是任何一种情况的“最终结果”?

标签: ios swift storyboard nslayoutconstraint


【解决方案1】:

改一下

self.view.removeConstraint(constraint1)

parentView.removeConstraint(constraint1)
self.view.layoutIfNeeded()

需要从包含该约束的标签和按钮的父视图中删除此约束

【讨论】:

  • self.view 是指 ViewController 的视图,而不是按钮和标签嵌套的子视图。
  • 将 parentView 挂钩为 outlet 并从中移除约束
  • 成功了!谢谢!知道为什么我不能只使用 isActive 布尔值来调整它吗?即constraint1.isActive = false
  • 这个属性只能设置一次,然后更改它会导致崩溃,因为约束无效
  • 按钮的高度是一个与 IBOutlet 挂钩的约束,但感谢您的警告。并感谢您提供信息!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多