比较IOS开发中代码布局与自动布局的优缺点与灵活性

开场白之自动布局:这什么鬼这么难用?

很多IOS开发人员在刚上手Autolayout时一定都会有这样的吐槽:我的天?excuseme?这是啥?约束在哪?怎么设?怎么设置出来和我想象的不一样?

优势:

1.灵活性:随着苹果公司越来越多分辨率的手机上线,传统安卓程序猿对于我们的仇恨也日渐削减,因为,我们也要开始适应各种各样的屏幕了啊!但是若是待他们深入了解了Autolayout之后,我一定会心疼他们。Autolayout灵活性在于,你基本不用考虑各种不同的分辨率下不同的布局方式了,直接在可视化界面上,进行拖动、连线、设置约束即可。顺便,在未来可能出现的6寸、7寸的手机上线时,你不用一边骂人,一边通宵加班修改界面了。

2.官方态度:做IOS这行的,都知道苹果是大爷。看你不爽,下架!你不理我?下架!看看苹果官方的态度,默认就是选择使用Autolayout,所以希望现在仍然坚持使用代码布局的coder们,差不多可以上手试用Autolayout了。

令人头疼的缺点(或者说是需要改变的地方吧):

1.布局思维的转变:传统的布局思维即定位。通过相对布局,可以获得整个页面控件的位置。但是使用Autolayout,你需要考虑的是,你所布局的这个控件相对于superview以及brotherview的上下左右位置。这是一种思维上的改变。

2.经常会出问题:使用autolayout可能会经常得到自己不想看到的样子,而且你改变frame还没用==。只要你考虑的相对的位置,就会乱掉,而且!你去用代码改变frame也不起作用!欲哭无泪。

3.手写自动布局代码:对于不熟悉自动布局原理的人不失为一种。好的办法我刚起步做IOS开发的时候,下载了一个demo,他满屏的代码是这样的:


[self.view addConstraint: [NSLayoutConstraint constraintWithItem:blueView
attribute:NSLayoutAttributeLeft
relatedBy:NSLayoutRelationEqual
toItem:redView
attribute:NSLayoutAttributeLeft
multiplier:1
constant:0]];

一脸懵比,对于新手可能不太友好,但是熟练了你就会爱上她。

autolayout 适用场景

1.基础界面:比如固定的就是那几个按钮啊,视图啊,输入框啊啥的,不解释,用autolayout!当你的页面不会变更整体布局和设计,只有在不同屏幕尺寸、不同文字和内容下有适应性的变化,那这种情况使用autolayout就再适宜不过了。不会在像frame的时代,苦逼的要为不同屏幕尺寸计算各自的位置点坐标和大小了。通常使用xcode->Editor->Pin/Align菜单为视图添加约束即可。一般通过InterfaceBuilder确定控件位置,当存在需要自动被拉伸、适应或位移的控件时就要添加constraint;

2.当你的界面有比较简单的布局改变:当需要产生动画或动态添加视图时,autolayout就暴露了出我认为让人抓狂的元凶——优先级(Priority)和布局冲突。autolayout对于相同方位的约束,如都是描述离superview上边缘距离的约束,如果这两个约束的数值不同,但是优先级一样,则autolayout将报布局冲突,将会根据其计算丢弃某一条约束(这时可能就会丢弃你想要的约束,而恰恰保留了你不想看到的布局)。所以,当我们发生布局变化时,无法像frame的绝对定位,直接改变,并且只有唯一的位置信息。那么,我们该怎么处理这种布局冲突呢?那就是让描述相同但数值不同的这两个约束采用不同的优先级。autolayout默认将使用数值较大的优先级约束。
但是当我们新增了一个更高优先级约束改变了视图布局,在完成一些操作后,又想变回去怎么办?这时就必须删除更高优先级的约束。
所以,对于视图有动态变更时,我的通常做法是:为需要变更的控件新增默认constraint,但对于这个默认constraint先降低优先级,在发生变化
再新增一个更高优先级的constraint2,且代码中用一个Dictionary缓存该constraint2的对象,便于我随时删除或重新新增,让视图来回变化。

传统的纯代码布局

优势

1.纯代码布局界面是复杂了点,但是谁敢说它没有优点?传统的穿代码布局是代码量大了点,但是对于刚上路的新司机来说,纯代码布局有助于他们理解官方API,记住那些常用的方法,而且,纯代码布局看起来逻辑清晰,相比较autolayout来说更容易阅读。

2.能够完成一些复杂操作:一个好的App,一定会有很多酷炫的用户交互界面,这个时候autolayout就有点捉襟见肘了,但是纯代码布局就比较强大了,通过调用系统的动画方法啊之类的,或者通过定时器等等,就能够完成一系列酷炫的动画。

适用场景

1.你的视图有较为复杂的动画效果或者较大的布局改变:
虽然autolayout可以完成所有的布局问题,但它仍然在某些情况下是不方便的,就像4.2节描述的,每次改变你必须新增或删除一个不同优先级的constraint,单说构造constraint对象的工作就够呛了,还可能必须缓存该对象,便于之后清除。所以,当你需要非常频繁的变更控件布局,并且变更的位置是不确定的(例如通过手势拖动一个视图到屏幕任意位置),那么,我建议此视图不要使用autolayout,而使用frame的所写即所得的绝对定位方式更好,你只需要充分考虑各种屏幕适配,并为其计算适合的坐标点即可。同时,我还建议这种频繁变更的视图甚至不要InterfaceBuilder来绘制,最好直接代码书写,因为一旦你勾选了autolayout,那么storyboard中的所有视图都将autolayout。而当你需要变更视图布局时,则必须使用
view.translatesAutoresizingMaskIntoConstraints = NO;
superview.translatesAutoresizingMaskIntoConstraints = NO;
来避免为你的视图新增默认autolayout约束。

最后再啰嗦两句

虽说autolayout已经IOS开发发展的趋势,但是不代表传统的代码布局已经过时。对于刚起步的人来说,我不建议使用autolayout,这会让你们懒惰,而且,使用代码布局可以让你们更好的记住和理解API。我肯定autolayout的灵活性和方便,它可以大大提高开发效率,对于老鸟来说,这是一样利器。

本文总阅读量