最近在面試以及與其余程序猿(不乏來自BAT大廠)的交流當(dāng)中,我發(fā)現(xiàn)還是有相當(dāng)大一部分是使用frame,為此也就出現(xiàn)了這篇文章。
在遠古時代使用的都是frame,很多4年以上的程序猿都是從frame開始的,但是那個只適用于iPhone 4這個3.5寸的手機,這是因為:frame是絕對布局,一旦設(shè)置,其origin(x,y)與size(width,height)便固定死了,不可更改。為此在尺寸不更改以及系統(tǒng)版本不更新的情況下是沒問題的,比如一直是3.5寸手機,iOS7系統(tǒng)等,但是這是不可能的。
但是約束(Masonry)就不一樣了,約束是一種相對布局,可以很好的適配所有情況,比如比如有無navigationBar,有無tabbar,iPhone X和非iPhone X,還有橫豎屏等。這些情況都是動態(tài)的,使用約束可以很好的展現(xiàn)。
比如下面這個常見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進行設(shè)置,那就太麻煩了。
使用約束(Masonry)就簡單多了,鏈接:《iOS - 適配iPhone X與iOS11最優(yōu)雅的解決方法,沒有之一》。一個if else語句就直接就適配了有無navigationBar,有無tabbar,iPhone X和非iPhone X,還有橫豎屏等所有情況。效果如下:


除了這種情況之外,還有一種情況下是使用約束比frame要簡單,那就是類似評論功能,其代碼鏈接是《iOS-UITableViewCell自適應(yīng)高度最優(yōu)雅的方法》。效果如下:

以上是最常見的約束優(yōu)于frame的兩種情況,由此衍生出來的,比如Label根據(jù)內(nèi)容自適應(yīng)高度等等,都比frame要強的多,那是因為使用frame的話,在給label賦完值之后還會調(diào)用一個sizeToFit或者layoutIfNeeded等方法,實在是麻煩,甚至在我看來根本都沒法去維護。
這里小編就先對其做一個簡單的對照:
1.frame是絕對布局,死值,而約束則既可以設(shè)置死值又可以設(shè)置一個相對值
2.frame在不同尺寸,不同系統(tǒng)下的適配性很低,也不易拓展,約束則不然、3.frame使用起來簡單,但是拓展性較差,而約束對程序猿來說代價比較大,也是比較考驗邏輯的
4.最重要的是蘋果對約束的支持越來越好,frame已窮途末路
在小編看來:雖然frame使用起來比較簡單,但是約束(Masonry)無論是拓展還是適配等方面優(yōu)勢十分大,可以說使用使用frame真心沒前途。
個人第三方庫:UDUserDefaultsModel