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佈局控制元件控制元件
- self.view.frame的佈局問題View
- rem佈局原理和優缺點REM
- Masonry自動佈局使用
- chrome frame使用記錄Chrome
- Flutter學習:什麼是Container以及佈局約束的實現FlutterAI
- 外媒評iPhone X:雖然價格不菲 但還是不錯iPhone
- 使用HTTP響應頭X-Frame-Options防止網頁被FrameHTTP網頁
- Python FramePython
- 【譯】Flutter | 深入理解佈局約束Flutter
- 什麼是閉包?有哪些使用場景?優缺點是什麼?
- iOS開發-Masonry約束寬高比iOS
- 缺前端是假的,缺優秀前端是真的前端
- 已知UIScrollView放大後的Frame和放大之前的Frame計算放大的瞄點座標UIView
- 使用Chrome Frame技術開發者小指南Chrome
- Android約束佈局到底為什麼香?Android
- Tkinter (06) 框架部件 Frame框架
- doc,view,frame互相呼叫View
- iOS自動佈局——Masonry詳解iOS
- Masonry佈局簡單朋友圈
- css實現三欄佈局的幾種方法及優缺點CSS
- Django框架,Flask框架和Tornado框架各有什麼優缺點Django框架Flask
- Google要推輸入法 是戰略佈局還是戰術需要?Go
- 做Oracle DBA 有前途?還是做Oracle ERP DBA 有前途?Oracle
- Android入門教程:ConstraintLayout約束佈局AndroidAI
- 學習python選擇線上好還是線下好?各有哪些優劣勢?Python
- iOS 自動佈局框架 – Masonry 詳解iOS框架
- iOS自動佈局框架 - Masonry詳解iOS框架
- WebSocket的Frame協議解析Web協議
- iOS 重寫cell的FrameiOS
- 呼叫Frame中的指令碼指令碼
- WEB安全~X-Frame-OptionsWeb
- 臺灣伺服器的優缺點是什麼?伺服器
- Redis持久化RDB和AOF優缺點是什麼?Redis持久化
- Android 約束佈局(ConstraintLayout)1.1.0 版詳解AndroidAI
- Android Material Design控制元件使用(一)——ConstraintLayout 約束佈局AndroidMaterial Design控制元件AI
- 程式設計是一個沒有前途的工作程式設計
- 優化MySQL,還是使用快取?優化MySql快取