iOS约束方程值

时间:2017-06-05 03:53:00

标签: ios swift autolayout constraints nslayoutconstraint

From Auto Layout Guide

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

目前这就是我的看法。

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

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

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

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

Auto Layout Guide

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

3 个答案:

答案 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个点,所以

  • O 2 .x = O 1 .x - 20
  • O 2 .y = O 1 .y

在这个坐标系BlueView的后缘是x = 120.所以我们得到:

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

正如您所看到的,布局属性BlueView.trailingRedView.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在水平方向上RedView8 points更远。

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

还有BlueView,您可以将约束应用于视图。

详细了解top layout guide, bottom layout guide, margins以获得清晰的理解。

修改

示例:

auto layoutBlueView 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

所以原点在哪里都没关系。