我试图找出约束方程中左右视图的值是什么。
目前这就是我的看法。
坐标系中的原点(0,0)位于左上角。
因此,靠近顶部和左侧的views.attribute更小。
在上面张贴的图片中。 RedView.Leading的值高于BlueView.trailing。 满足等式因为8被添加到BlueView.trailing。
同样适用于下图中带圆圈的约束。 superView.top小于greyView.top,因为superView.top在origin.x上。
我的问题是相对于原点的值?
答案 0 :(得分:3)
是和否。其实更没有。但最重要的是:这是无关紧要的!
布局属性是视图位置和大小的抽象描述。
虽然尺寸属性可以描述绝对值(例如view.height = 20.0
),但位置属性始终相对到另一个位置属性。这就是为什么Apple只在他们的例子中显示两个视图,没有任何坐标系。等式
RedView.leading = 1.0 × BlueView.trailing + 8.0
指出RedView
的前沿始终位于BlueView
后缘右侧8.0点。底层坐标系的起源无关紧要!
假设我们有一个坐标系Σ 1 ,原点为O 1 ,我们假设BlueView
的后缘位于x = 100尊重那个起源。这意味着:
BlueView.trailing = 100
RedView.leading = 1.0 × 100 + 8.0 = 108
现在我们看一个不同的坐标系Σ 2 ,原点O 2 向左移动了20个点,所以
在这个坐标系BlueView
的后缘是x = 120.所以我们得到:
BlueView.trailing = 120
RedView.leading = 1.0 × 120 + 8.0 = 128
正如您所看到的,布局属性BlueView.trailing
和RedView.leading
的值在Σ 1 和Σ 2 中有所不同。但是,视图之间的水平间距是相同的
RedView.leading – BlueView.trailing = 8
在两个坐标系中。
描述视图相对于彼此的位置和大小,而不是使用相对于特定坐标系的绝对值。
当我告诉你将车停在邻居的车后面并留下1米的间隙时,你知道该怎么做,对吧?不知道道路的起点!
这并不重要。
但是 - 我想这就是让你问这个问题的原因 - 系统需要在某个时刻“告诉”显示器为特定视图绘制哪些像素。像素网格 具有绝对原点和固定坐标系。
所以最终,在解决所有约束方程之前,系统将替换最外层视图(窗口)的布局属性。在那个时间点你的布局属性将相对于一个特定的原点(很可能是左上角的窗口的起源,是的),但它只是无关紧要!
Apple可以选择他们想要的任何坐标系(即使是一个原点在屏幕上方50点的坐标系),无论该系统如何,您的布局在同一组中仍然看起来相同约束
答案 1 :(得分:1)
您提出的所有问题都需要了解Auto Layout
。
Leading, Trailing, Top, Bottom
和其他几个约束被w.r.t应用于视图。
示例强>:
RedView.leading = 1.0 x BlueView.trailing + 8.0
此处,leading
的{{1}}约束适用于RedView
BlueConstraint
无论它是什么。即trailing
在水平方向上RedView
比8 points
更远。
https://developer.apple.com/library/content/documentation/UserExperience/Conceptual/AutolayoutPG/index.html 提供了对自动布局约束的良好了解,它们应用于何种上下文以及视图如何根据它们进行布局。
还有BlueView
,您可以将约束应用于视图。
详细了解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
的{{1}}为:frame
同样来自上面的等式,
RedView
即,(x: 12, y: 0, width: 4, height: 2)
因此,该等式对BlueView.trailing = RedView.leading - 8.0
和BlueView.trailing = 12.0 - 8.0 = 4.0
都有效。
答案 2 :(得分:1)
不,值与原点无关。算了吧。 要定位它们,必须有一些额外的约束应用于这些视图属性:
left, right, top, bottom, leading, trailing, width, height, centerX, centerY, lastBaseline, firstBaseline, leftMargin, rightMargin, topMargin, bottomMargin, leadingMargin, trailingMargin, centerXWithinMargins, centerYWithinMargins.
同样在iOS 9中添加了不同类型的anchorPoints,以便更容易地添加约束。
此外,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
所以原点在哪里都没关系。