【问题标题】:Enabling/Disabling NSLayoutConstraints in InterfaceBuilder在 InterfaceBuilder 中启用/禁用 NSLayoutConstraints
【发布时间】:2015-05-15 16:15:30
【问题描述】:

NSLayoutConstraint(在iOS 8.0 中)有一个名为activeBOOL 属性,可以轻松地动态禁用/启用所述布局约束。

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

让我在这里澄清一下,我不想删除它们,只是禁用它们,这样我就可以设计第二个集合,而界面构建器不会一直抱怨不匹配的约束。 此外,切换尺寸等级不是一种选择,因为布局集适用于同一个尺寸等级。

有没有办法这样做?

提前致谢

马耳他

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

【问题讨论】:

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


    【解决方案1】:

    在情节提要中选择要禁用的约束,然后Option+Command+4 显示属性检查器,然后取消选择已安装。

    【讨论】:

    • 哇,谢谢它的工作,我真的虽然取消选中安装会使它们在这个大小的类中无法访问!非常感谢!
    • 在 Xcode 8 中,您必须选中“使用特征变化”选项才能启用它。
    • @AmmarMujeeb 你在哪里做的?
    • 然后您可以在代码中设置isActive 属性以重新“安装”约束?
    • 当用户将应用程序置于后台并返回时,这可能会导致问题。
    【解决方案2】:

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

    我对这个问题的解决方案是确保所有约束都已安装,并添加一个用户定义的运行时属性,其键为“活动”,类型为“布尔”,值为“假”。

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

    【讨论】:

    • 很好的解决方法。但是,您仍然会收到与冲突约束相关的所有 Interface Builder 警告和错误。我想知道为什么没有为 active 属性提供可以解决此类问题的复选框。
    • 是的,这不是特别令人愉快,但我不知道完全符合 IB 的修复程序。希望未来版本的 Xcode 能够认识到此设置的必要性。
    • 您始终可以将标记为未激活的约束的优先级设置为 9999 以使警告静音。
    • 自iOS9发布以来,使用UIStackView处理元素必须出现和消失的布局通常更容易和更整洁。
    • @Ash 但并非适用于所有情况。例如,我的 UI 有不同的状态,对于不同的状态,我需要激活不同的约束。例如,用户配置文件从屏幕的一侧飞到另一侧。
    【解决方案3】:

    我在没有收到任何警告的情况下使用 Xcode 8 和 Swift 3 的解决方案未选中 Interface builder、Inspector 选项卡上的 Installed 框:

    然后创建 IBOutlets 并在 viewDidLayoutSubviews()

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

    确保先移除约束,否则会得到消息日志无法同时满足约束...

    【讨论】:

      【解决方案4】:

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

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

      这实现了什么:

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

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

      【讨论】:

      • 在 Xcode 12 中,此复选框未显示。请指导。
      猜你喜欢
      • 1970-01-01
      • 2016-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多