iOS约束方程值

336*_*784 9 constraints ios autolayout nslayoutconstraint swift

从自动布局指南

我试图找出约束方程中左右视图的值是什么.

目前这就是我的看法.

坐标系中的原点(0,0)位于左上角.

因此,靠近顶部和左侧的views.attribute更小.

在上面张贴的图片中.RedView.Leading的值高于BlueView.trailing.满足等式因为8被添加到BlueView.trailing.


这同样适用于下图中带圆圈的约束.superView.top小于greyView.top,因为superView.top在origin.x上.

自动布局指南


我的问题是相对于原点的值?

Mis*_*cha 3

自动布局中的相对论

\n
\n

简短回答:

\n

是和不是。其实更没有。但最重要的是:这无关紧要!

\n
\n

详细解答:

\n

布局属性是视图位置和大小的抽象描述。

\n

职位属性:

\n
    \n
  • 顶部
  • \n
  • 底部
  • \n
  • 领导
  • \n
  • 尾随
  • \n
  • ...
  • \n
\n

尺寸属性:

\n
    \n
  • 宽度
  • \n
  • 高度
  • \n
\n

虽然大小属性可以描述绝对值(例如view.height = 20.0),但位置属性始终对于另一个位置属性。这就是为什么苹果在他们的例子中只显示了两个视图,没有任何坐标系。等式

\n
RedView.leading = 1.0 \xc3\x97 BlueView.trailing + 8.0\n
Run Code Online (Sandbox Code Playgroud)\n

表示 的前缘始终位于后缘RedView右侧的 8.0 点。BlueView底层坐标系的原点并不重要!

\n

假设我们有一个坐标系 \xe2\x88\x91 1,其原点为 O 1,并且假设 的BlueView后沿相对于该原点位于 x = 100 处。这意味着:

\n
BlueView.trailing = 100\nRedView.leading = 1.0 \xc3\x97 100 + 8.0 = 108\n
Run Code Online (Sandbox Code Playgroud)\n

现在我们看一个不同的坐标系 \xe2\x88\x91 2,原点为 O 2向左移动 20 个点,所以

\n
    \n
  • O 2 .x = O 1 .x \xe2\x80\x93 20
  • \n
  • O 2 .y = O 1 .y
  • \n
\n

在这个坐标系中BlueView的后缘位于 x = 120 处。因此我们得到:

\n
BlueView.trailing = 120\nRedView.leading = 1.0 \xc3\x97 120 + 8.0 = 128\n
Run Code Online (Sandbox Code Playgroud)\n

正如您所看到的,布局属性的值在 \xe2\x88\x91 1BlueView.trailing和\xe2\x88\x91 2中是不同的。但是,视图之间的水平间距是相同的RedView.leading

\n
RedView.leading \xe2\x80\x93 BlueView.trailing = 8\n
Run Code Online (Sandbox Code Playgroud)\n

在两个坐标系中。

\n

这就是自动布局的全部要点:

\n

描述视图相对于彼此的位置和大小,而不是使用相对于特定坐标系的绝对值。

\n
\n

当我告诉你把车停在邻居车后面并留出 1 米的间隙时,你知道该怎么做,对吧?不知道路从哪里开始!

\n
\n

这并不重要。

\n
\n

然而 \xe2\x80\x93 ,我想这就是让你问问题 \xe2\x80\x93 的原因,系统需要在某个时刻“告诉”显示器为特定视图绘制哪些像素。并且像素网格确实有绝对原点和固定的坐标系。

\n

因此最终,系统将在求解所有约束方程之前替换最外层视图(窗口)的布局属性。那时,您的布局属性与特定原点相关(很可能是窗口的原点在左上角,是的),但它根本不相关!

\n

苹果可以选择他们想要的任何坐标系(甚至是原点位于屏幕上方 50 点的坐标系),并且无论使用哪种特定系统,在相同的约束条件下,您的布局仍然看起来相同。

\n