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
}