iOS 约束方程值

iOS constraint equation values

我想找出约束方程中左右视图的值是多少。

目前我是这样看的。

坐标系原点(0,0)在左上角。

因此views.attribute越靠近顶部和左边越小。

在上面张贴的图片中。 RedView.Leading 的值高于 BlueView.trailing。 因为BlueView.trailing加上了8,所以满足等式。


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


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

您所问的一切都需要 Auto Layout 的知识。

Leading, Trailing, Top, Bottom 和其他几个约束被应用 w.r.t 到视图。

示例:

RedView.leading = 1.0  x BlueView.trailing + 8.0

在这里,RedViewleading 约束被应用 w.r.t BlueConstraint trailing 无论它是什么。即 RedView 在水平方向上比 BlueView 放置 8 points 远。

https://developer.apple.com/library/content/documentation/UserExperience/Conceptual/AutolayoutPG/index.html 提供了有关自动布局约束、应用它们的上下文以及视图如何根据它们进行布局的良好知识。

还有 top layout guide, bottom layout guide, margins 可以将约束应用于视图。

阅读更多关于 auto layout 的内容以获得清晰的理解。

编辑:

示例:

BlueView frame: (x: 0, y: 0, width: 4, height: 2)

现在我们得到的BlueView trailing是:4

所以现在我们将 RedView leading 设置为:

RedView.leading = 1.0  x BlueView.trailing + 8.0

RedView.leading = 1.0 x 4 + 8.0 = 12.0

所以现在 RedViewframe 是:(x: 12, y: 0, width: 4, height: 2)

同样从上面的等式,

BlueView.trailing = RedView.leading - 8.0

BlueView.trailing = 12.0 - 8.0 = 4.0

因此,方程对 RedViewBlueView 都有效。

不,值与原点无关。忘了这个吧。 要定位它们,必须对视图的此类属性应用一些额外的约束,例如:

left, right, top, bottom, leading, trailing, width, height, centerX,  centerY, lastBaseline, firstBaseline, leftMargin, rightMargin, topMargin, bottomMargin, leadingMargin, trailingMargin, centerXWithinMargins, centerYWithinMargins.

同样在 iOS 9 中添加了不同种类的锚点以使添加约束更容易。

Autolayout 还添加了本地化的前导和尾随属性,其位置(前导位于视图的左侧或右侧)取决于设备区域设置。

我建议使用以下等式: redView.width = 0 + 1 * blueView.width redView.height = 0 + 1 * blueView.height

redView.leading = 20 + superView.leading blueView.trailing = -20 + superView.trailing redView.bottom - blueView.bottom redView.bottom = superview.bottom - 20

所以起点在哪里并不重要

自动布局中的相对论


简答:

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


详细答案:

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

职位属性:

  • 顶部
  • 底部
  • 领先
  • 尾随
  • ...

尺寸属性:

  • 宽度
  • 身高

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

RedView.leading = 1.0 × BlueView.trailing + 8.0

表示 RedView 的前缘始终在 BlueView 的后缘右侧 8.0 点。底层坐标系的原点无关紧要!

假设我们有一个原点为 O1 的坐标系 ∑1 并假设 BlueView 的后缘相对于原点位于 x = 100 处。这意味着:

BlueView.trailing = 100
RedView.leading = 1.0 × 100 + 8.0 = 108

现在我们看一个不同的坐标系∑2,原点O2向左移动了20个点,所以

  • O2.x = O1.x – 20
  • O2.y = O1.y

在此坐标系中BlueView的后缘位于x = 120。所以我们得到:

BlueView.trailing = 120
RedView.leading = 1.0 × 120 + 8.0 = 128

如您所见,布局属性 BlueView.trailingRedView.leading 的值在 ∑1 和 ∑2[ 中是不同的=107=]。但是,视图之间的水平间距是相同的

RedView.leading – BlueView.trailing = 8

在两个坐标系中。

这就是自动布局的全部意义所在:

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

When I tell you to park your car behind your neighbor's car and leave a 1 meter gap in between, you know what to do, right? Without knowing where the road begins!

不重要。


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

所以最终,系统会在求解所有约束方程之前将布局属性替换为最外面的视图(window)。在那个时间点你的布局属性 是相对于一个特定的原点(很可能 window 的原点在左上角,是的)但它根本无关紧要!

Apple 可以选择他们想要的任何坐标系(即使是原点在屏幕上方 50 点的坐标系),无论使用哪种特定系统,您的布局看起来仍然相同具有相同的约束集。