使用自动布局将视图定位在 (c + (x * superview.width))
Using autolayout to position view at (c + (x * superview.width))
目前我对自动布局有点困惑。我在 .xib 文件中有一个 UITableViewCell
:
我的目标是从第一行所在的位置 (x = 74
) 开始,在单元格上获得一组水平等间距的垂直线。
我一直在尝试自动布局约束的大量组合,但我似乎无法做到正确。让我最接近的约束如下:
然而,multiplier
让我彻底糊涂了。在第一个屏幕截图中,multiplier
是 6
、2
和 1
(从左到右),考虑到位置,这对我来说意义不大的观点。
最终目标基本上是让每一行定位在:(c + (x * superview.width))
,在这种情况下,c
是 74
,x
是 multiplier
.
有人可以在这里给我一些指示吗?谢谢!
终于,我找到了一个解决方案,我在下面详细介绍了它:
- 按住 Control 从子视图拖动到父视图并创建一个
Trailing Space to Container
约束
- 双击边栏中的约束
- 将
Second Item
更改为 <subview>.Center X
- 颠倒第一项和第二项
- 将
constant
更改为 -74
- 将
multiplier
改为0.14
的倍数,从左边开始
我最终遇到了这个限制:
我认为如果使用间隔视图,您可能会发现事情更容易。使用尽可能多的垂直线之间的差距。将它们的宽度限制为相等。限制水平间距,使它们 运行 顺序为 [line][spacer][line]….
但是,要解决您提出的问题:select 第一个项目的弹出菜单(在您的屏幕截图中显示 Superview.Center X)并告诉 Xcode 交换第一项和第二项。乘数适用于第二项的属性。
约束的一般形式是:
firstItem.firstAttribute == secondItem.secondAttribute * multiplier + constant
(关系也可以是 <=
或 >=
。)
您的屏幕截图转换为:
Superview.Center X == Image View.Center X * 6 + 69
您乘以图像视图的中心 X 坐标,考虑到您描述的目标,这没有意义。你大概想要这样的东西:
Image View.Center X == Superview.Width * 1/3 + 69
问题是,如果 "works" 定义为 "vertical lines equally spaced horizontally",您将永远找不到适用于所有 devices/orientation(具有不同宽度)的乘数。为此,您需要:
Image View.Center X == (Superview.Width - 69) * 1/3 + 69
也就是说,您需要乘以宽度减去起点后的余数。
您可以将线条嵌入子视图中,在这种情况下您不需要 69 点起始值。
目前我对自动布局有点困惑。我在 .xib 文件中有一个 UITableViewCell
:
我的目标是从第一行所在的位置 (x = 74
) 开始,在单元格上获得一组水平等间距的垂直线。
我一直在尝试自动布局约束的大量组合,但我似乎无法做到正确。让我最接近的约束如下:
然而,multiplier
让我彻底糊涂了。在第一个屏幕截图中,multiplier
是 6
、2
和 1
(从左到右),考虑到位置,这对我来说意义不大的观点。
最终目标基本上是让每一行定位在:(c + (x * superview.width))
,在这种情况下,c
是 74
,x
是 multiplier
.
有人可以在这里给我一些指示吗?谢谢!
终于,我找到了一个解决方案,我在下面详细介绍了它:
- 按住 Control 从子视图拖动到父视图并创建一个
Trailing Space to Container
约束 - 双击边栏中的约束
- 将
Second Item
更改为<subview>.Center X
- 颠倒第一项和第二项
- 将
constant
更改为-74
- 将
multiplier
改为0.14
的倍数,从左边开始
我最终遇到了这个限制:
我认为如果使用间隔视图,您可能会发现事情更容易。使用尽可能多的垂直线之间的差距。将它们的宽度限制为相等。限制水平间距,使它们 运行 顺序为 [line][spacer][line]….
但是,要解决您提出的问题:select 第一个项目的弹出菜单(在您的屏幕截图中显示 Superview.Center X)并告诉 Xcode 交换第一项和第二项。乘数适用于第二项的属性。
约束的一般形式是:
firstItem.firstAttribute == secondItem.secondAttribute * multiplier + constant
(关系也可以是 <=
或 >=
。)
您的屏幕截图转换为:
Superview.Center X == Image View.Center X * 6 + 69
您乘以图像视图的中心 X 坐标,考虑到您描述的目标,这没有意义。你大概想要这样的东西:
Image View.Center X == Superview.Width * 1/3 + 69
问题是,如果 "works" 定义为 "vertical lines equally spaced horizontally",您将永远找不到适用于所有 devices/orientation(具有不同宽度)的乘数。为此,您需要:
Image View.Center X == (Superview.Width - 69) * 1/3 + 69
也就是说,您需要乘以宽度减去起点后的余数。
您可以将线条嵌入子视图中,在这种情况下您不需要 69 点起始值。