最近在面试以及与其余程序猿(不乏来自BAT大厂)的交流当中,我发现还是有相当大一部分是使用frame,为此也就出现了这篇文章。
在远古时代使用的都是frame,很多4年以上的程序猿都是从frame开始的,但是那个只适用于iPhone 4这个3.5寸的手机,这是因为:frame是绝对布局,一旦设置,其origin(x,y)与size(width,height)便固定死了,不可更改。为此在尺寸不更改以及系统版本不更新的情况下是没问题的,比如一直是3.5寸手机,iOS7系统等,但是这是不可能的。
但是约束(Masonry)就不一样了,约束是一种相对布局,可以很好的适配所有情况,比如比如有无navigationBar,有无tabbar,iPhone X和非iPhone X,还有横竖屏等。这些情况都是动态的,使用约束可以很好的展现。
比如下面这个常见VC布局:
如果使用frame就很简单了,代码如下:
self.view.backgroundColor = [UIColor greenColor];
UIView *blueView = [[UIView alloc] initWithFrame:CGRectMake(0.0, 0.0, 100, 100)];
blueView.backgroundColor = [UIColor blueColor];
self.blueView = blueView;
[self.view addSubview:blueView];
UIView *redView = [[UIView alloc] initWithFrame:CGRectMake(0.0, CGRectGetHeight(self.view.frame) - 100.0, 100.0, 100.0)];
redView.backgroundColor = [UIColor redColor];
[self.view addSubview:redView];
但是这个样子隐患非常大:非常不易于拓展。比如有无navigationBar,有无tabbar,iPhone X和非iPhone X,还有横竖屏。倘若一直对frame进行设置,那就太麻烦了。
使用约束(Masonry)就简单多了,链接:《iOS - 适配iPhone X与iOS11最优雅的解决方法,没有之一》。一个if else语句就直接就适配了有无navigationBar,有无tabbar,iPhone X和非iPhone X,还有横竖屏等所有情况。效果如下:
除了这种情况之外,还有一种情况下是使用约束比frame要简单,那就是类似评论功能,其代码链接是《iOS-UITableViewCell自适应高度最优雅的方法》。效果如下:
以上是最常见的约束优于frame的两种情况,由此衍生出来的,比如Label根据内容自适应高度等等,都比frame要强的多,那是因为使用frame的话,在给label赋完值之后还会调用一个sizeToFit或者layoutIfNeeded等方法,实在是麻烦,甚至在我看来根本都没法去维护。
这里小编就先对其做一个简单的对照:
1.frame是绝对布局,死值,而约束则既可以设置死值又可以设置一个相对值
2.frame在不同尺寸,不同系统下的适配性很低,也不易拓展,约束则不然、3.frame使用起来简单,但是拓展性较差,而约束对程序猿来说代价比较大,也是比较考验逻辑的
4.最重要的是苹果对约束的支持越来越好,frame已穷途末路
在小编看来:虽然frame使用起来比较简单,但是约束(Masonry)无论是拓展还是适配等方面优势十分大,可以说使用使用frame真心没前途。
个人第三方库:UDUserDefaultsModel