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

And*_*rew 18 ios

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

Vin*_*ath 47

这里真的只有两件事:

  • 自动尺寸
  • 自动版式

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

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

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

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

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

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

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

一个简单的例子NSLayoutConstraint说明:视图的宽度将是其超视图宽度的一半乘以60%.

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

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

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

Apple的AutoLayout指南,API文档和AutoLayout上的介绍性WWDC视频非常出色,这些都是了解更多信息的最佳地点.

  • 我正在写一个答案,但你的答案更好.干得好! (4认同)