GeekBand_OC实战第三周——AutoLayout
这一周了解了UIView的层次结构,Autoresizing和AutoLayout。然后用AutoLayout给界面添加了约束,适配不同屏幕上的应用。
它们的作用类似于排版。
首先我们创建了一个界面,它的层次结构是这样的:
uiview层次结构界面对象有上下级,下级显示在上级上面,同级对象(sibling),编号较末的显示在上面。
之后,我们通过UIKit的坐标系,用代码来定位每个view在应用界面中的位置。
坐标系对于一些比较简单的页面定位可以用Autoresizing来实现。然而在iOS6+之后,xcode中的size inspector对于Autoresizing的编辑被AutoLayout代替,只有在File inspector中将use AutoLayout的选项去掉,才可以重新编辑Autoresizing的size框和它的边界约束。
然而,Autoresizing只能描述上下级界面之间的约束。
AutoLayout能够支持更多样的视图关系和定位属性。现在一般都用AutoLayout。其实如果不是用代码init一个view,创建的视图默认开启了Autoresizing,并且会调用setTranslatesAutoresizingMaskIntoConstraints,将Autoresizing Mask 转换为 Auto Layout 的约束。所以如果要自己编辑AutoLayout属性,需要将视图的setTranslatesAutoresizingMaskIntoConstraints属性设置为No。
AutoLayout的使用
这个其实如果不是通过代码建立,在xcode所见所得界面操作的话,比较像一个自己鼓捣能够完全搞定的排版工作。
ctrl+拖动一个界面对象到空白处,就可以选择添加一个和该方向对应的约束,比如向上拖可以添加垂直居中或者到界面顶边缘的距离。
当界面对象较多,拖动容易被干扰时,可以拖到当前viewcontroller的左侧inspector,也可以弹出添加约束的选项。
当对象的约束显示为红色,表示有不合理约束或约束不够,如果添加修改后变成蓝色,说明约束合理。
除了拖动方法,也可以在 storyboard底部的工具bar上用各个控件来调整或者更新约束。
iOS8的autolayout新增加了adaptive特性,iOS9增加了stackview特性。前者在不同大小屏幕为对象增加class属性,调整他们在不同屏幕的显示,后者允许为几个对象归并成一个stack,让他们排版时一起被操作。
如果用代码实现AutoLayout,需要用到AutoLayout约束对应的类NSLayoutConstraint,它里面的一些函数可以用于让view对象按constraint equation进行排版。