Enabling/Disabling Interface Builder 中的 NSLayoutConstraints

Enabling/Disabling NSLayoutConstraints in InterfaceBuilder

NSLayoutConstraint(在iOS 8.0中)有一个名为activeBOOL属性,这使得disable/enable所述布局约束变得容易-苍蝇。

要为视图控制器创建第二个布局集,然后我可以通过编程方式 enable/disable (通过两个集的 IBOutletCollection of NSLayoutConstraints ),我需要禁用我已经在界面生成器中定义了布局约束。

让我在这里明确一点,我不想删除它们,只是禁用它们,这样我就可以设计第二个集合,而无需界面构建器一直抱怨不匹配的约束。 此外,切换大小 classes 不是一个选项,因为布局集适用于一个相同的大小 class.

是否有这样做的选项?

提前致谢

马尔特

更多信息:SDK Version: 8.1Deployment Target 8.0

Select 您想在故事板中禁用的约束,以及 Option+Command+4 显示属性检查器,然后取消选择已安装。

我以前使用Gabbler提供的解决方案成功,但最近我使用Swift 2.0和Xcode 7尝试了同样的事情,发现它不再有效。正如人们所料,设置为未安装的约束根本没有安装,并且在打开或关闭时对布局没有影响。

我对该问题的解决方案是确保所有约束都已安装,并使用键 'active'、类型 'boolean' 和值 'false' 添加用户定义的运行时属性。

用户定义的运行时属性面板可以在自定义 Class 字段下方的身份检查器中找到。

我使用 Xcode 8 和 Swift 3 的解决方案没有收到任何警告,未选中界面生成器上的 Installed 框,Inspector 选项卡:

然后在 viewDidLayoutSubviews()

上以编程方式创建 IBOutlets 和 add/remove 它们
view.removeConstraints([constraints to remove, ...])
view.addConstraints([constraints to add, ...])

确保先删除约束,否则您将收到消息日志无法同时满足约束...

对于这种特殊情况,我会在代码中声明我的约束。

// Card View Animatable Constraints
private lazy var cardViewHeightConstraint: NSLayoutConstraint = cardView.heightAnchor.constraint(equalToConstant: 500)
private lazy var cardViewEqualHeightConstraint: NSLayoutConstraint = cardView.heightAnchor.constraint(equalTo: view.heightAnchor, multiplier: 0.8)

然后您可以随时激活或停用它们。

override func viewDidLoad() {
    super.viewDidLoad()

    cardViewHeightConstraint.isActive = true
    cardViewEqualHeightConstraint.isActive = false
}

而且您仍然可以在界面生成器中完成大部分布局。您可以设置一个将在运行时删除的约束,以便 Interface Builder 仍将反映您的布局(或至少其中之一)的外观。只需创建一个约束并检查 "Remove at build time" 属性。

这实现了什么:

  • 您仍然需要为大部分布局使用 Interface Builder
  • 您不会收到任何 IB 警告
  • 有效。

唯一的缺点是界面生成器将无法完全代表您的布局。