无数人趟过此坑,大部分人在坑中一蹶不振,小部分人爬起来也是跌跌撞撞。ios
有不少人都说auto layout和manual layout的坐标设置是不能混用的,会致使出现布局问题。首先声明一点,autolayout和manuallayout是能够混用的。用的时机很重要,auto layout和manual layout有各自的生命周期和做用域,区分他们两个的做用时间很关键,头脑中必定要清楚你所添加的每条约束,在什么时间场合,会形成什么后果。不然,布局就会和预想的不一样,各类奇怪的布局问题也就接踵而至。布局
咱们在controller视图上面用auto layout添加了一个subview,并在各个系统调用声明周期方法中作了打印处理,结果以下:spa
其中前面带有“-”符号的表示的是subview视图的打印。orm
autolayout的做用范围是从上往下第三个方法-updateConstraints一直到viewDidLayoutSubviews,这期间,系统是经过view上的约束来计算view上的布局。而咱们通常习惯将布局写在viewDidLoad里面,这就是咱们为何老是没法用manual layout的方法去修改咱们的布局。生命周期
要想修改布局,必需要在autolayout结束以后才会起做用,不然会被系统将咱们的布局按照autolayout从新刷新,从上面咱们能够看到,咱们能够在子视图的-layoutSubviews和-drawRect方法里面修改子视图的布局,可是通常视图为了重用不会在本身的类里面将frame写死,这样咱们只有经过controller的viewDidAppear方法修改视图的frame。可是这样也有问题,在viewDidAppear里面修改布局,咱们能够看到一个明显的延迟,系统调用次序使然,咱们没法去改变。除此以外,若是咱们更新了视图的autolayout,会致使视图从新调用updateViewConstraints方法,viewDidAppear在进入页面的时候却只调用一次,结果就是subview又恢复了原来的样子。作用域
因此个人建议就是不要同时manual layout+auto layout去控制同一个视图。始终记得若是用了auto layout去控制了一个视图,那么就要坚持用下去。开发
我以为混用的说法不是对于某一个视图说的,是说咱们整个布局当中交叉使用了manual layout + auto layout,好比咱们能够用auto layout布局viewA,而后用manual layout 布局B,而后将A与B用二者其一的方式,添加到共同的父viewC上,这就是我所认为的混用。it
那么它的意义是什么呢?不一样view的复杂度决定了咱们采起哪一种方式来对其布局,咱们在开发中有可能会遇到某些流式的布局,咱们用autolayout能够行云流水,可是对于某个视图当中极其复杂的小控件的布局,auto layout显然要写很多的一大段,当二者组合时也就是混用的意义所在。io
混用的风险其实一点不比它带来的好处小,首先解释一个名字date
NSAutoresizingMaskLayoutConstraint
这个类型和NSLayoutConstraint 功能相似,它是个私有类,咱们没法获取到,由于苹果ios6以后推出了auto layout技术,可是还想兼容原来的autoresizing,因此它将autoresizing转化为了约束,转化后的约束类型就是NSAutoresizingMaskLayoutConstraint,这就有可能致使系统为咱们添加了许多咱们没法预料的约束。
咱们有时候会发现咱们的约束没有写全,可是布局却很好,千万不要太得意,这只是系统帮你完成你该作的,这种状况当然对咱们有好处。可是在manual layout + auto layout布局中就会发生大问题,系统不懂咱们是在故意不写它的约束(由于咱们打算手动布局这一块的视图),它就默默帮咱们加上了谁都不知道的约束,并为本身的机智暗自欣喜。咱们要明确告诉它我不须要你的帮助才行。
UIView里translatesAutoresizingMaskIntoConstraints属性就是用来控制是否容许系统作这样的转化,默认是YES。因此咱们要把它设置为NO,而后将你漏掉的约束通通加上。
怎样算做完备的约束呢,个人建议是把视图层次分清楚,每一个层次系统内部使用统一的布局方案,并保证系统内的的约束完整。
这是一个视图的层级拓扑结构(原谅我又盗图了,凑合看吧),若是我打算在作黄箭头位置的视图布局时采用auto layout,其余采用manual layout那么我只需保证它及它下面的两个子视图之间的约束完整就能够了,他们三个能够当作一个小的系统,系统内的约束只与他们本身相关,像下面两个红线链接的视图间的约束就是不容许添加的。
图:错误的约束关系
以上就是我想说的,混用这种手段仍是但愿你们谨慎使用为好,最后总结一下混用的关键点
1.首先要确保在你打算使用手写auto layout为view布局前,将其translatesAutoresizingMaskIntoConstraints属性设为NO
2.不要用对同一个视图同时使用manual layout + auto layout
3.确保你的约束在其系统内完好无损失。