iOS-UI佈局是約束(Masonry)還是frame?雖各有優缺點,但使用frame真心沒前途

weixin_33782386發表於2018-10-07

最近在面試以及與其餘程式猿(不乏來自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佈局:


10887362-be6b70d0498d1baa.png
一個常見的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,還有橫豎屏等所有情況。效果如下:

10887362-c020c3360e7e6d6c.png
有navigationBar和tabbar的情況

10887362-59ab961495fda483.png
iPhone X橫屏

除了這種情況之外,還有一種情況下是使用約束比frame要簡單,那就是類似評論功能,其程式碼連結是《iOS-UITableViewCell自適應高度最優雅的方法》。效果如下:

10887362-9f04ff48d1cfec09.png
評論自適應高度

以上是最常見的約束優於frame的兩種情況,由此衍生出來的,比如Label根據內容自適應高度等等,都比frame要強的多,那是因為使用frame的話,在給label賦完值之後還會呼叫一個sizeToFit或者layoutIfNeeded等方法,實在是麻煩,甚至在我看來根本都沒法去維護。

這裡小編就先對其做一個簡單的對照:
1.frame是絕對佈局,死值,而約束則既可以設定死值又可以設定一個相對值
2.frame在不同尺寸,不同系統下的適配性很低,也不易擴充,約束則不然、3.frame使用起來簡單,但是擴充性較差,而約束對程式猿來說代價比較大,也是比較考驗邏輯的
4.最重要的是蘋果對約束的支援越來越好,frame已窮途末路

在小編看來:雖然frame使用起來比較簡單,但是約束(Masonry)無論是擴充還是適配等方面優勢十分大,可以說使用使用frame真心沒前途。

個人第三方庫:UDUserDefaultsModel

相關文章