以编程方式访问自动布局约束

4
我有一个视图,它有很多子视图,我将这些视图称为“父视图”、“子视图A”、“子视图B”、“子视图C”等。
因此,我需要访问设置在subView A和superview之间的尾部空间约束,并对其进行修改。这个约束会出现在superview.constraints中。
然而,所有的子视图都有在它们和superview之间设置的前导/尾随空间约束。
因此,如果我记录superview.constraints,它看起来像这样:
<__NSArrayM 0xac744e0>(
<NSLayoutConstraint:0x98f3500 H:|-(0)-[UILabel:0x98f2190]   (Names:     '|':HeaderReusableView:0x98f1f40 )>,
<NSLayoutConstraint:0x98f3540 H:[UILabel:0x98f2190]-(20)-|   (Names:   '|':HeaderReusableView:0x98f1f40 )>,
<NSLayoutConstraint:0x98f3580 V:[UILabel:0x98f2190]-(-4)-|   (Names: '|':HeaderReusableView:0x98f1f40 )>,
<NSLayoutConstraint:0x98f35c0 V:[UIView:0x98f2770]-(42)-|   (Names: '|':HeaderReusableView:0x98f1f40 )>,
<NSLayoutConstraint:0x98f3600 H:[UIView:0x98f2770]-(20)-|   (Names: '|':HeaderReusableView:0x98f1f40 )>,
<NSLayoutConstraint:0x98f3640 H:|-(0)-[UIView:0x98f2770]   (Names: '|':HeaderReusableView:0x98f1f40 )>,
<NSLayoutConstraint:0x98f3680 H:|-(0)-[UIView:0x98f2610]   (Names: '|':HeaderReusableView:0x98f1f40 )>,
<NSLayoutConstraint:0x98f36c0 H:[UIView:0x98f2610]-(0)-|   (Names: '|':HeaderReusableView:0x98f1f40 )>,
<NSLayoutConstraint:0x98f3700 V:[UIView:0x98f2610]-(1)-|   (Names: '|':HeaderReusableView:0x98f1f40 )>,
<NSLayoutConstraint:0x98f3740 V:[UIView:0x98f2920]-(107)-|   (Names: '|':HeaderReusableView:0x98f1f40 )>,
<NSLayoutConstraint:0x98f3780 H:[UIView:0x98f2920]-(20)-|   (Names: '|':HeaderReusableView:0x98f1f40 )>,
<NSLayoutConstraint:0x98f37c0 H:|-(0)-[UIView:0x98f2920]   (Names: '|':HeaderReusableView:0x98f1f40 )>,
<NSLayoutConstraint:0x98f3800 H:[UIButton:0x98f19c0]-(178)-|   (Names: '|':HeaderReusableView:0x98f1f40 )>,
<NSLayoutConstraint:0x98f3840 V:[UIButton:0x98f19c0]-(55)-|   (Names: '|':HeaderReusableView:0x98f1f40 )>,
<NSLayoutConstraint:0x98f3880 H:|-(0)-[UILabel:0x98f2a80]   (Names: '|':HeaderReusableView:0x98f1f40 )>,
<NSLayoutConstraint:0x98f38c0 V:[UILabel:0x98f2a80]-(109)-|   (Names: '|':HeaderReusableView:0x98f1f40 )>,
<NSLayoutConstraint:0x98f3900 H:[UILabel:0x98f2a80]-(20)-|   (Names: '|':HeaderReusableView:0x98f1f40 )>,
<NSLayoutConstraint:0x98f3940 H:|-(171)-[UIButton:0x98f2ff0]   (Names: '|':HeaderReusableView:0x98f1f40 )>,
<NSLayoutConstraint:0x98f3980 V:[UIButton:0x98f2ff0]-(55)-|   (Names: '|':HeaderReusableView:0x98f1f40 )>

我不知道哪个限制条件才是我需要的。


好的,我弄清楚了。NSLayoutConstraint有一个名为firstItem和secondItem的属性。这些是设置约束的视图。通常,secondItem将是视图本身。因此,view.constraints [0] .secondItem是视图。 - nyus2006
3个回答

7

我已经理解了。NSLayoutConstraint具有一个名为firstItem和secondItem的属性。这些是设置约束的视图。

通常,secondItem将是视图本身。因此,view.constraints[0].secondItem是view。


这取决于具体情况。如果你有一个子视图与父视图的顶部、底部、前导和尾随对齐,那么在设置顶部和前导约束时,子视图通常是第一个项目;而在设置底部和尾随约束时,则相反。 - Ruiz

6

创建 IBOutlet 绑定到您感兴趣的约束条件。您可以从画布中的约束条件创建(有时候这很难做到),或从左侧场景列表中的约束条件列表中创建。


1
谢谢您的回答。我知道如何使用IB来完成它,但不确定如何以编程方式完成。正如我的问题标题所示 :) - nyus2006
当然,这仅适用于您只需要修改一个子视图的情况。如果有未知数量的子视图需要更改约束,则必须对您正在使用的UIView(按钮?标签?单元格?)进行子类化,添加属性并在创建约束时设置它。 - Breno Gazzola

0
另一种对我来说更简单的方法是将约束的出口Ctrl+拖到ViewController.m或ViewController.h文件中,然后您可以设置/获取它的常量、优先级、第一个项目、第二个项目等。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接