我们如何在容器中将视图水平居中?

时间:2018-12-19 02:58:15

标签: ios

我是iOS开发的新手,我对对齐有疑问。当我想使视图水平居中时,我发现有两种方法(我错了吗?) 1.)大小检查器->排列(位置视图,我选择水平居中    在容器中) 或

2。)对齐约束->在容器中水平放置

A)这两种方法有什么区别? B)当我想使一个视图居中时,应该实现哪个视图还是应该同时实现两个视图?

2 个答案:

答案 0 :(得分:2)

这里实际上只有两件事:

自动调整大小(大小检查器->排列(位置视图,我选择在容器中水平居中)

AutoLayout (对齐约束->在容器中水平放置)

自动调整大小基本上是Apple为使开发人员能够构建动态布局而引入的旧方法的统称。屏幕旋转是这里要解决的第一个用例。因为当屏幕旋转(或调整大小)时,屏幕中的子视图很可能在新调整大小的超级视图中保留不正确的帧(位置和大小)。为了解决这个问题,Apple引入了一系列可枚举的属性(称为“自动调整大小蒙版”),这些属性告诉超级视图以特定方式对待子视图。其中包括:

宽度/高度灵活,可将子视图扩展到可用的最大宽度/高度

灵活的前导/尾随/顶部/底部空间,它允许特定的边可变,依此类推。

视图可以包含这些枚举属性的任意组合。

这是不充分的,因为除其他缺陷外,它没有规定关于相对于其同级视图如何布局视图(如果是动词)的规则。它还需要大量额外的编码来手动调整方向更改时的视图大小。

这是AutoLayout输入图片的地方。苹果公司建立了一个基于约束的框架-可以应用于视图以及视图之间的规则,这些规则将确定如何在可变的屏幕尺寸下调整视图的大小。这些约束在名为NSLayoutConstraint的类中进行构造,该类的每个实例(约束)具有以下重要属性:

对其施加约束的项目(视图) 约束适用于的视图属性(高度,宽度,前缘,后缘等) 与约束相关的第二项(同级,子级或父级视图) 第二项的属性 约束乘数:用于指定基于比率的约束 约束的值(或常数):有趣的是,约束的唯一属性可以在实例化后更改。 概括地说,一个NSLayoutConstraint的简单示例是:视图的宽度将是其父视图的宽度的一半乘以60%。

基于AutoLayout的UI将由许多此类约束组成,这些约束将共同发挥作用,以表达明确且无冲突的UI布局。

现在,使这一切正常工作的AutoLayout引擎与屏幕上的视图进行交互,并在需要时调用AutoLayout消息(例如layoutSubviews),以便在屏幕上发生更改(例如方向更改,超级视图)时自动调整视图的大小(布局)调整大小等。

约束通常是由InterfaceBuilder添加的(.xib和.storyboard文件),但是通过代码添加约束的原理相同:创建一个NSLayoutConstraint实例,并将其添加到适用的最高视图中(例如,如果存在子视图和父视图之间的约束,应将该约束添加到父视图。如果两个子视图之间存在约束,请再次将其添加到父视图。)

B: 您应该实现 AutoLayout 。 无需同时实现。

答案 1 :(得分:0)

是的,您可以同时使用两种方法,我建议您使用的方法是:

首先将其以X为中心放置在超级视图中,将底部空间0放置在底部布局指南中。它可能是这样的:

enter image description here


双击底部空间,然后将视图底部更改为中心Y:


enter image description here

如果您不使用自动版式,则只需一行代码:

childView.center = parentView.center

如果您使用的是自动版式,则可以将子视图的内部居中放置,如下所示:

childView.centerXAnchor.constraint(equalTo: parentView.centerXAnchor).isActive = true
childView.centerYAnchor.constraint(equalTo: parentView.centerYAnchor).isActive = true

这些约束将随着可用空间的变化而自动更新。

从iOS 3.2起可用