在Interface Builder中启用/禁用NSLayoutConstraints

时间:2015-03-13 08:36:01

标签: ios objective-c xcode interface-builder autolayout

NSLayoutConstraint(在iOS 8.0中)有一个名为BOOL的{​​{1}}属性,可以轻松地即时禁用/启用所述布局约束。

要为视图控制器创建第二个布局集,然后我可以通过编程方式启用/禁用(通过两个集合的active IBOutletCollection),我需要禁用已定义的布局接口构建器中的约束。

让我在这里清楚我不想删除它们,只是禁用它们以便我可以设计第二组而不需要界面构建器一直抱怨不匹配的约束。 此外,切换大小类不是一种选择,因为布局集适用于同一个大小的类。

有选择吗?

先谢谢

马尔特

更多信息:NSLayoutConstraints SDK Version: 8.1

4 个答案:

答案 0 :(得分:24)

在故事板中选择要禁用的约束,然后选择选项 + 命令 + 4 以显示“属性”检查器,然后取消选择“已安装”。 / p>

答案 1 :(得分:13)

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

我对此问题的解决方案是确保所有约束都已安装,并使用键“活动”添加用户定义的运行时属性,键入' boolean'和价值'虚假'。

用户定义的运行时属性面板可以在Custom Class字段下面的Identity Inspector中找到。

答案 2 :(得分:2)

我在使用Xcode 8和Swift 3时没有收到任何警告的解决方案未选中“界面”构建器,“检查器”选项卡上的已安装框:

Installed box on Interface builder

然后创建IBOutlets并在 viewDidLayoutSubviews()

上以编程方式添加/删除它们
view.removeConstraints([constraints to remove, ...])
view.addConstraints([constraints to add, ...])

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

答案 3 :(得分:1)

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

// 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仍将反映布局(或其中至少一个)的外观。只需创建一个约束,然后检查“在构建时删除”属性即可。

In a constraint's size or attribute inspector, check the "Remove at build time" box.

这实现了什么:

  • 您必须在大多数布局中仍然使用Interface Builder
  • 您将没有任何IB警告
  • 有效。

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