在iOS中,自动resize,AutoLayout和约束之间有什么区别?

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

这里真的只有两件事:

  • 自动尺寸
  • 自动版式

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

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

  • 灵活的前导/尾随/顶部/底部空间,允许特定边缘可变,等等。

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

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

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

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

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

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

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

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

Apple的AutoLayout指南 , API文档和关于AutoLayout的介绍性WWDCvideo非常出色,这些将是了解更多信息的最佳场所。