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
在这里,RedView
的 leading
约束被应用 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
所以现在 RedView
的 frame
是:(x: 12, y: 0, width: 4, height: 2)
同样从上面的等式,
BlueView.trailing = RedView.leading - 8.0
即BlueView.trailing = 12.0 - 8.0 = 4.0
因此,方程对 RedView
和 BlueView
都有效。
不,值与原点无关。忘了这个吧。
要定位它们,必须对视图的此类属性应用一些额外的约束,例如:
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.trailing
和 RedView.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 点的坐标系),无论使用哪种特定系统,您的布局看起来仍然相同具有相同的约束集。
我想找出约束方程中左右视图的值是多少。
目前我是这样看的。
坐标系原点(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
在这里,RedView
的 leading
约束被应用 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
所以现在 RedView
的 frame
是:(x: 12, y: 0, width: 4, height: 2)
同样从上面的等式,
BlueView.trailing = RedView.leading - 8.0
即BlueView.trailing = 12.0 - 8.0 = 4.0
因此,方程对 RedView
和 BlueView
都有效。
不,值与原点无关。忘了这个吧。 要定位它们,必须对视图的此类属性应用一些额外的约束,例如:
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.trailing
和 RedView.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 点的坐标系),无论使用哪种特定系统,您的布局看起来仍然相同具有相同的约束集。