Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 在InterfaceBuilder中启用/禁用NSLayoutConstraints_Ios_Objective C_Xcode_Interface Builder_Autolayout - Fatal编程技术网

Ios 在InterfaceBuilder中启用/禁用NSLayoutConstraints

Ios 在InterfaceBuilder中启用/禁用NSLayoutConstraints,ios,objective-c,xcode,interface-builder,autolayout,Ios,Objective C,Xcode,Interface Builder,Autolayout,NSLayoutConstraint(在iOS 8.0中)有一个名为active的BOOL属性,可以轻松地动态禁用/启用所述布局约束 要为视图控制器创建第二个布局集,然后可以通过编程方式启用/禁用(通过NSLayoutConstraints的IBOutletCollection为这两个集启用/禁用),我需要在interface builder中禁用已定义的布局约束 让我在这里澄清一下,我不想删除它们,只是禁用它们,这样我就可以设计第二个集合,而无需interface builder一直抱怨约束不

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

要为视图控制器创建第二个布局集,然后可以通过编程方式启用/禁用(通过
NSLayoutConstraints
IBOutletCollection
为这两个集启用/禁用),我需要在interface builder中禁用已定义的布局约束

让我在这里澄清一下,我不想删除它们,只是禁用它们,这样我就可以设计第二个集合,而无需interface builder一直抱怨约束不匹配。 此外,切换大小类不是一个选项,因为布局集用于一个相同的大小类

有这样做的选择吗

提前谢谢

麦芽糖


进一步信息:
SDK版本:8.1
部署目标8.0

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

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

我的解决方案是确保安装了所有约束,并添加一个用户定义的运行时属性,该属性的键为“active”,类型为“boolean”,值为“false”


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

我使用Xcode 8和Swift 3的解决方案未收到任何警告,已取消选中Interface builder上的“安装”框,Inspector选项卡:

然后在viewDidLayoutSubviews()上创建IBoutlet并以编程方式添加/删除它们


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

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

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

这将实现:

  • 大多数布局都必须使用Interface Builder
  • 你不会有任何IB警告
  • 它起作用了

唯一的缺点是interface builder将无法完全表示您的布局。

哇,谢谢您的工作,我真的认为取消选中“已安装”会使它们在这种大小的类中无法访问!谢谢!在Xcode 8中,您必须选中“使用特征变量”选项才能启用它。@AmmarMujeeb您在哪里执行此操作?然后您可以在代码中设置
isActive
属性以重新“安装”约束?当用户将应用程序放在后台并返回时,这可能会导致问题。解决方法很好。但是,您仍然会收到与冲突约束相关的所有Interface Builder警告和错误。我想知道为什么没有为活动属性提供复选框来解决这类问题。是的,这不是特别令人愉快,但我不知道一个完全符合IB的修复程序。希望未来版本的Xcode能够识别此设置的必要性。您可以始终将标记为not active的约束的优先级设置为9999以使警告静音。自iOS9发布以来,使用UIStackView处理元素必须出现和消失的布局通常更容易、更整洁,但并非所有情况都如此。例如,我的UI有不同的状态,对于不同的状态,我需要激活不同的约束。例如,用户配置文件从屏幕的一侧飞到另一侧。
override func viewDidLoad() {
    super.viewDidLoad()

    cardViewHeightConstraint.isActive = true
    cardViewEqualHeightConstraint.isActive = false
}