iOS-UI佈局是約束(Masonry)還是frame?雖各有優缺點,但使用frame真心沒前途
最近在面試以及與其餘程式猿(不乏來自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
相關文章
- tkinter中frame佈局控制元件控制元件
- rem佈局原理和優缺點REM
- Python FramePython
- Masonry動畫更新約束動畫
- Flutter學習:什麼是Container以及佈局約束的實現FlutterAI
- 使用HTTP響應頭X-Frame-Options防止網頁被FrameHTTP網頁
- DRBD是什麼意思?優缺點是什麼?
- Android入門教程:ConstraintLayout約束佈局AndroidAI
- 【譯】Flutter | 深入理解佈局約束Flutter
- Android Material Design控制元件使用(一)——ConstraintLayout 約束佈局AndroidMaterial Design控制元件AI
- 什麼是閉包?有哪些使用場景?優缺點是什麼?
- iOS開發-Masonry約束寬高比iOS
- Android 約束佈局(ConstraintLayout)1.1.0 版詳解AndroidAI
- Android約束佈局到底為什麼香?Android
- Tkinter (06) 框架部件 Frame框架
- Django框架,Flask框架和Tornado框架各有什麼優缺點Django框架Flask
- iOS自動佈局——Masonry詳解iOS
- Masonry佈局簡單朋友圈
- 缺前端是假的,缺優秀前端是真的前端
- css實現三欄佈局的幾種方法及優缺點CSS
- 點選劫持漏洞:使用X-Frame-Options 解決方法(應用tomcat)Tomcat
- WebSocket的Frame協議解析Web協議
- WEB安全~X-Frame-OptionsWeb
- 如何使用 pyav 抽取 I-frame (關鍵幀)
- 學習python選擇線上好還是線下好?各有哪些優劣勢?Python
- 什麼是閉包,閉包的優缺點?
- 雲主機的優缺點是什麼呢
- 測試用例編寫有哪些方式?各有什麼優缺點?
- 雖然這塊主機板價格有點小貴,但用過之後,感覺還是可以接受的
- nginx設定X-Frame-OptionsNginx
- UIKit Inside: frame bounds position anchorPoint centerUIIDE
- zend_vm_stack_push_call_frame
- Tkinter (27) 框架部件 ttk.Frame框架
- Ijkplayer skip_frame 什麼意思?
- Stack frame layout on x86-64
- Frame Grab幀影像匯出工具
- Masonry佈局控制元件,自動換行控制元件
- 雖然《劍/盾》寶可夢確實很醜,但設計上還是很有趣的