0

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

在此处输入图像描述

它会自动创建 4 个约束:

在此处输入图像描述

修改数字后,我明白了这一切的含义。我们有 2 个垂直空间和 2 个水平空间。但让我们先关注垂直...

从屏幕顶部测量的垂直空间之一(我猜是superview),我给这个数字30。从底部测量的其他垂直空间,我给-50。

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

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

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

  1. 如何使用代码手动设置垂直空间(30 和 -50)?因为从情节提要中我看不到垂直空间的任何不同名称或 ID。他们都有相同的名字。我必须创建 2NSLayoutConstraint吗?
  2. 那么如何将它添加到_screenView中呢?我必须创建这个:[_screenView addConstraint: myConstraint];两次吗?
  3. multiplier用来做什么的?因为我在情节提要中看不到该选项。

非常感谢您。

4

1 回答 1

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 在屏幕的左上角,值从那里上升。

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

于 2013-09-19T00:42:00.207 回答