1.viewDidLoad 和viewDidLayoutSubviews
自动执行,由系统调用。
执行顺序是先执行:
第一次加载视图的时候:
viewDidLoad()
2.IOS7各种bar的布局
IOS7以前的版本是没有提供专门的解决方案的,要自己写if...else...判断,VC中可以通过.topLayoutGuide和.bottomLayoutGuide的.length来获取目录VC上面的各种Bar和下面的各种Bar挤占了多少VC空间。
上边所有栏所占空间的大小(nav横竖屏时,高是不一样的)
.topLayoutGuide
下边所有栏所占空间的大小
.bottomLayoutGuide
隐藏状态栏
-(BOOL)prefersStatusBarhidden
3.绘制布局
drawRect方法中,绘制视图后,如果关掉AutoLayout的,图形可能会出现问题,解决的方法,将视图contentMode属性设置为Redraw。
Redraw:专门用于绘制图形视图,当视图大小发生变化时,重新绘制视图,相当于给视图重新发送:setNeedsDisplay。
4.视图的自身布局
4.1 是什么
VC对自己的小跟班view有布局能力
UIViewController
-(void)viewDidLayoutSubviews
-(void)viewWillLayoutSubviews
其实视图本身也有布局的能力
UIView
-(void)layoutSubviews
当视图大小发生变化时,就会自动调用此方法,可以对当前视图的所有子视图进行布局。
4.2 什么时候使用
一般情况下,VC的viewDidLayoutSubviews负责布局,但如果我们的视图是自定义的,那可以在视图内部对自己的子视图进行布局。
4.3 注意
一定要关掉Autolayout
layoutSubview方法不应该主动调用
当视图显示前会自动调用
如果需要主动调用,比如修改的内容以后希望再次布局,应该向视图对象发送消息:setNeedsLayout
参考:
VC:viewWillAppear viewDidLayoutSubviews
view:setNeedsDisplay setNeedsLayout
4.4 调用顺序问题
VC:viewWillLayoutSubViews
View:LayoutSubviews
View:LayoutSubviews
VC: ViewDidLayoutSubViews
实现步骤:
tableview->默认cell显示、默认数据问题->默认Cell、自定义数据显示->自定义Cell默认数据显示->自定义Cell自定义数据->重新布局
5.Autoresizing 布局
5.1 是什么
是旧版(ios5及以前)的自动布局技术
特点:操作简单,api简单,功能简单,有局限性,现在依然有效。
struts/spring -> Autoresizing
5.2 干什么
管理子视图的一些简单布局
实现原理:
当界面大小发生变化时,根据变化的比例,对子视图也进行同比例变化。
5.3 怎么用
(1)首先关闭AutoLayout(不关掉看不到)
(2)选中需要布局的子视图
(3)在检查器中(5)
(4)点击
autoresizing:选择相应的视图
外框(4个):红线负责子视图到父视图的边距
选中红色,距离固定,否则弹簧效果
内框(2个):红线负责子视图是否可以左右或上下拉伸
注:有些功能Autoresizing是不具备的,此时我们就需要代码布局,进行补充。代码的方式会在Autoresizing后执行,会将Autoresizing不足的地方进行修改。
5.4 Autoresizing技术也有代码的实现方式,如果需要支持多个布局方向,"|"同时处理多个方向。
属性:button.autoresizingMask = …Left… | … Right…;
6.AutoLayout(自动布局)
6.1 是什么
IOS6开始的一个新的布局技术
功能强大,操作复杂。
从xcode5开始,已经很好用了,xcode6中加强。
6.2 工作原理
两大原则:参照、约束。
(1)是通过一系列的"约束"(Contrait)来完成布局的。
(2)什么是约束
约束是一个对象,是一个条件。
(3)如何使用约束
我们可以创建很多约束"对象"加入到视图中,此视图会自动满足这些约束所要求的条件,从而达到自动布局的目的。
自动布局的本质是给视图加约束,加很多约束。视图自动计算出自己满足约束条件的.frame。
(4)如何创建约束对象
用storyboard或xib来创建,其实就是在storyboard中配置。
用code方法来创建
<1>普通代码方式来创建
<2>使用框架方式来创建
6.3 使用步骤(storyboard)
(1)打开自动布局(AutoLayout)
(2)选中布局中需要的视图对象
(3)创建相应的约束对象
6.4 storyboard中的使用方式
(1)快速切换storyboard里的视图尺寸
(2)对齐约束
居中约束(相对于父视图)
相对约束(两个视图键相对关系)
//下面的约束针对于上面的控件
update frame:
添加约束的同时,更新视图的frame。
(3)位置约束
添加距父视图上、下、左、右边距的距离
宽的约束、高的约束
添加相对位置约束
等宽和登高
//上面位置的约束针对下面的?
(4)批量处理
update Frames 根据设置的约束更新视图
update Contrains 根据视图位置更新约束
add missing … 添加缺少的不严谨的约束
6.5 约束的两大原则:
1>描述清楚 (如果不清楚,橙色)
2>互不冲突 (如果冲突,显示红色)
如果满足两大原则,蓝色。
7.AutoLayout的代码方式
7.1 什么时候用
当子视图对象是用代码创建的,并且需要给子视图布局时,只能用代码的方式自动布局。
7.2 怎么用
(1)创建约束对象
API->NSLayoutConstrain类
(2)将约束对象添加到父视图类中
(3)创建一个约束对象
//参数1:给哪个视图添加约束
//参数2:视图的属性
//参数3:视图与相对视图的关系
//参数4:相对视图
//参数5:相对视图的属性
//参数6:系数(是否需要父视图中属性值)
+(id)constrainWithItem:(id)view1 attribute:
(NSLayoutAttribute)arrt1 relateBy:
(NSLayoutRelation)relation toItem:(id)view2 attribute:
(NSLayoutAttribute)arrt2 multiplier:(CGFloat)mutiplier constant:(CGFloat)c;