在阅读Apple文档时,我发现了对autoresizing,AutoLayout和约束的引用。在代码中使用所有这些之间的区别是什么?在iOS 9中以编程方式应用这些技术的正确方法是什么?
答案 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 guides,API documentation以及关于AutoLayout的介绍性WWDC videos非常出色,这些将是了解更多内容的最佳位置。