在iOS中,自动调整,AutoLayout和约束之间的区别是什么?

时间:2016-04-05 19:05:09

标签: ios

在阅读Apple文档时,我发现了对autoresizing,AutoLayout和约束的引用。在代码中使用所有这些之间的区别是什么?在iOS 9中以编程方式应用这些技术的正确方法是什么?

1 个答案:

答案 0 :(得分:46)

这里真的只有两件事:

  • 自动调整大小
  • 自动版式

Autoresizing 基本上是Apple为了使开发人员能够构建动态布局而引入旧方式的统称。这里要解决的第一个用例是屏幕旋转。由于当屏幕旋转(或以其他方式调整大小)时,屏幕中的子视图很可能在新尺寸的超视图中保持不正确的frame(位置和大小)。为了解决这个问题,Apple引入了一系列可枚举的属性(称为Autoresizing Masks),告诉superview以特定方式处理子视图。其中包括:

  • 灵活的宽度/高度,可以使子视图扩展到最大的宽度/高度

  • 灵活的前导/尾随/上/下空间,允许特定边缘变化,等等。

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

这是不充分的,因为除了其他缺点之外,它没有规定关于如何在其他兄弟观点中布置视图(如果这是一个动词)的规则。它还需要大量额外的编码来手动调整方向更改的视图。

这是AutoLayout进入图片的地方。 Apple构建了一个框架,该框架基于constraints - 可以应用于视图和视图之间的规则,这将决定视图在可变屏幕大小中的大小。这些约束在一个名为NSLayoutConstraint的类中构造,并且此类的每个实例(约束)都具有以下重要属性:

  • 应用约束的项目(视图)
  • 约束适用于的视图属性(高度,宽度,前缘,后缘等)
  • 与约束相关的第二项(兄弟或子视图或父视图)
  • 第二项的属性
  • 约束的乘数:用于指定基于比率的约束
  • 约束的值(或constant):有趣的是,实例化后可以更改的约束的唯一属性。

一个简单的NSLayoutConstraint示例,用于说明:视图的宽度将是其超视图宽度的一半乘以60%。

您的基于AutoLayout的UI将包含许多此类约束,这些约束将共同表达一个明确且无冲突的UI布局。

现在 AutoLayout引擎,使其全部工作,与屏幕上的视图交互,在需要时调用layoutSubviews等AutoLayout消息,以便在更改时自动调整大小(布局)视图在屏幕上出现,例如方向改变,调整大小的超级视图等。

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

Apple的AutoLayout guidesAPI documentation以及关于AutoLayout的介绍性WWDC videos非常出色,这些将是了解更多内容的最佳位置。