使用Xcode和手动编码理解约束

时间:2013-09-19 00:26:51

标签: ios objective-c xcode nslayoutconstraint

我刚刚阅读了一些关于如何以编程方式操作约束数的信息,但我认为我需要使用Xcode直观地看到它。所以我决定放一个这样的UIView,看看Constraints发生了什么:

enter image description here

自动创建4个约束:

enter image description here

修改数字后,我得到了所有这些的含义。我们有2个垂直空间和2个水平空间。但是让我们首先关注垂直......

从屏幕顶部测量的垂直空间之一(我认为是超视图),我给出了这个数字30.和从底部测量的其他垂直空间,我给了-50。

现在,当它变成代码时,我真的不明白如何给出这两个数字。据我所知,这里是如何用代码设置约束:

NSLayoutConstraint *myConstraint =[NSLayoutConstraint
                                   constraintWithItem:_screenView
                                   attribute:NSLayoutAttributeHeight
                                   relatedBy:NSLayoutRelationEqual
                                   toItem:_container
                                   attribute:NSLayoutAttributeHeight
                                   multiplier:20
                                   constant:200];
[_screenView addConstraint: myConstraint];

我们假设_screenView是一个超级视图,_container是UIView放在它上面。我有3个问题:

  1. 如何使用代码手动设置垂直空间(30和-50)?因为从故事板我没有看到任何不同的垂直空间名称或ID。他们都有相同的名字。我是否必须创建2 NSLayoutConstraint
  2. 那么如何将其添加到_screenView中?我必须创建这个:[_screenView addConstraint: myConstraint];两次吗?
  3. multiplier用于什么?因为我在故事板中没有看到这个选项。
  4. 非常感谢你。

1 个答案:

答案 0 :(得分:6)

我认为在处理约束时,从Apple的Auto Layout Guide中考虑这个公式非常重要:

y = m*x + b, where:

y and x are attributes of views.

m and b are floating point values.

您可以将_container顶部的约束视为:

_containter.top = m*_screenView.top + b

使用NSLayoutConstraint constraintWithItem:...创建约束时,乘数参数为“m”,此公式中的常量为“b”。要创建一个约束,使_container的顶部保持在_screenView顶部以下30个点,您可以这样做:

NSLayoutConstraint *myConstraint =[NSLayoutConstraint
                                   constraintWithItem:_container
                                   attribute:NSLayoutAttributeTop
                                   relatedBy:NSLayoutRelationEqual
                                   toItem:_screenView
                                   attribute:NSLayoutAttributeTop
                                   multiplier:1.0
                                   constant:30.0];

底部约束是:

NSLayoutConstraint *myConstraint =[NSLayoutConstraint
                                   constraintWithItem:_container
                                   attribute:NSLayoutAttributeBottom
                                   relatedBy:NSLayoutRelationEqual
                                   toItem:_screenView
                                   attribute:NSLayoutAttributeBottom
                                   multiplier:1.0
                                   constant:-50.0];

另请注意,在UIKit坐标系中,X值从左向右上升,Y值从上到下上升。换句话说,0,0位于屏幕的左上角,值从那里开始。

如果要创建上面显示的四个约束,则必须单独创建它们。您还可以使用NSLayoutConstraint的constraintsWithVisualFormat:options:metrics:views:方法一次创建多个。我发现用上面的方式写出来就更清楚了。