現在大公司做iOS開發的時候,界面一般用的是手寫代碼,還是用xib/storyboard?

如果是用代碼,有什麼優勢?

如果是用xib/storyboard,有什麼優勢?

如果用兩者其中之一,日後適配採用什麼方案?

大公司(比如騰訊,新浪)


搞iOS開發的都知道Ray Wenderlich吧,Ray Wenderlich早在去年的13年就舉辦了一場辯論,有土鱉地址:http://www.youtube.com/watch?v=XciUazpOfFUfeature=c4-overviewlist=UUz3cM4qLljXcQ8oWjMPgKZA

Ray Wenderlich博客的地址:Storyboards vs NIBs vs Code: The Great Debate!

我看完了整個視頻,3個人分別是storyboards, NIBs和code的擁護者,辯論的也非常熱烈,我總結了下:

Code

好處:

1. 代碼是很簡潔的,你沒有必要去打開NIBS或者其他文件去看它的屬性,這在當你打開一個2年前的或者寫的很亂的project時候非常有用

壞處:

1. 代碼可以重寫NIB和storyboard的屬性,這就會導致很亂,比如NIB的中的屬性是TRUE,但是你可以用代碼重寫

2. 如果用code,那麼你必須的寫完,然後運行才能看出效果,這樣就很慢,不所見即所得

3. 在code裡面set x,y是一個很不直觀的事情,而且浪費時間

4. UI設置需要很多代碼量,多的代碼以為著會引入潛在的bug,寫多代碼也意味著浪費時間

NIBs

好處:

跟code相比,NIBS可以直接讓開發者看到,開發者關心的是界面

壞處:

如果你有一個project,裡面有十來個controller,而每個controller又包括很多NIB文件,這樣就會很亂,因為你得從幾十個NIB文件中找出來再修改

Storyboards

好處:

1. Storyboards是未來,而且Storyboards 可以干code和NIB幹不了的事情

2. Storyboards 可以讓你避免很多代碼,比如一些自定義的特效

3. 而且Storyboards 不僅僅只是一個,可以是好多個,這個人平時工作的團隊有5個人,他們有10來個Storyboards ,你可以把Storyboards 分成不同的section,比如feed section,talk section,你可以看到界面的布局,你可以看到哪個連接著哪個

壞處:

1. 局限就是當你和很多人一起開發的時候,因為Storyboards會保存所有的文件在一個文件中,所以分享是非常困難的

2. 重用性不好,你可以重用,但是沒有NIBS那樣直接

總的來說,支持storyboard的小夥子很有活力,一直說storyboard是未來,而支持NIBs的女開發者被說服了,表示以後要用用storyboard。

最後,大家一致同意,初學者應該從代碼來下手,因為你知道怎麼寫代碼了,你也就知道怎麼用Storyboards 和NIBS實現了(你必須知道裡面是怎麼實現的)。

那麼問題來了,到底用什麼?

我個人意見是,當你做小型或者中型應用的時候,還是用storyboard吧,確實簡單易用快速。而大型的,多人一起做(需要svn,git進行同步)的項目還是NIBs加代碼吧。


本座經歷過幾個大公司(名字不表避免被人肉),答案是:

都有。

另外,本座在WWDC的時候和其他開發者討論用XIB還是Storyboard還是代碼手寫的問題,其答案也各不相同。

是手寫代碼,還是XIB或者Storyboard各有各的好處和壞處。業內並沒有定論。

純手寫代碼的好處,一是在代碼版本管理系統中不易產生衝突,有衝突也好解決。二是容易寫出通用的UI組件,通過合理的設計模式進行重用。三是靈活,可以達成任何想要的效果。

壞處:對於複雜的界面,代碼不管是寫還是讀都太費勁。尤其是現在iOS8時代,auto resize mask力不從心,UI布局使用autolayout幾乎是必然的,而放棄設計工具使用純代碼調試autolayout那幾乎是噩夢,光是layout constraint的那個丑得一比的字元表現形式就讓人不爽。當然也有團隊更極端,連autolayout也不用,用代碼在layoutSubviews裡面硬算,「手動」布局,這個本座認為就是純粹吃飽撐的了。

XIB/Storyboard的好處:好用,易用。壞處:很難重用。以及容易被新手濫用。在版本管理工具裡面也不容易看出到底是哪些修改。

本座絕對禁止團隊把多個UIViewController放到一個Storyboard裡面,一個Storyboard裡面只允許一個UIViewController,跳轉邏輯用代碼寫。原因很簡單:避免衝突。如果把整個App所有的布局邏輯寫到一個Storyboard裡面,在多分支下版本衝突幾乎是無法避免的事,而Storyboard作為一個格式不透明的巨大XML文件,一旦產生衝突,幾乎是無法解決的,只能放棄一個衝突版本,在另一個版本的基礎上重做一遍。在Xode5以後,蘋果改進了Storyboard的格式,XML的結構在GIT中更容易無衝突地merge,但巨大化的Storyboard還是應該避免。

Storyboard如果使用得當,對於生產力的提高極有好處。別的不說,光是Storyboard可以設計靜態UITableView這一點,就省了很多事。最新的Size class可以支持Storyboard在不同的設備上截然不同的布局,如果用純代碼?分分鐘寫死你。所以本座主張該用Storyboard就用,但不能濫用。具體操作的時候,什麼邏輯可以放Storyboard裡面,什麼應該放代碼裡面,也是有技巧的,做好了事半功倍,做壞了下一個程序員接手的時候會罵你祖宗十八代。具體什麼技巧這裡就不展開了。


越獄之後反編譯一下就知道了,xib會保留在資源中的。就說微信,5.0的代碼有以下nib

GTMOAuth2ViewTouch.nib

SyncPhoneContactsView.nib

LBSErrorViewController.nib

SyncPhoneContactsViewController.nib

PeopleNearByItemTableViewCell.nib

ShakeTableViewCell.nib

我自己的代碼現在全部純代碼,而且是100%使用約束,包括動畫部分

當然之前的一些項目帶有frame的動畫我也是能改成約束盡量改成約束

好處是做版本對比的時候很清楚對ui做了哪些改動,而且會方便日後團隊

合作


聲明一下,本人沒去過大公司,以下內容主要是回答這幾個問題的:

如果是用代碼,有什麼優勢?
如果是用xib/storyboard,有什麼優勢?
如果用兩者其中之一,日後適配採用什麼方案?

如果是用代碼,有什麼優勢?

1)對那些沒用過 UI 工具的技術來說,不需要再學習一個新東西了。

2)跨平台的時候,UI 的布局邏輯可以直接翻譯到另一個平台,如果用 xib 的話,android 的布局得重新排,這個過程中更容易出現兩個平台不統一,或者 交互bug。

如果是用xib/storyboard,有什麼優勢?

1)可視化(再也不用告訴技術人員這個東西要放左邊第幾個像素了)

2)基本上可以讓美術來處理 UI (技術人員輔助),減少技術人員的工作量(開發+維護)

3)熟練使用這個流程的話,開發效率會高不少

如果用兩者其中之一,日後適配採用什麼方案?

基本上不管是使用代碼還是 xib,都應該在一開始包含適配邏輯(比如,對齊屏幕右邊緣,不管是代碼還是 xib 都可以實現),寫得好的話,或者邏輯簡單的話,基本上是可以無視屏幕尺寸的。

複雜情況,xib 還是得配合代碼使用。

最後大膽回答題目,大公司一般 app 都有跨平台+同步交互邏輯的需求,使用代碼布局(標準化控制項)會更合適些。當然,更好的公司完全可以開發自己的跨平台 UI 編輯器,這樣就沒有死角了。

本人是偏好使用 UI 編輯器做開發的,看那些用代碼做 UI 的人感覺就像放著 PS 不用非要用代碼繪圖一樣。想想蘋果開發 Interface 是為了什麼?

個人相關:

xib 開發 iOS APP 1年+ (storyboard 沒用過)

XAML 開發 WP 1年+ (除布局外,可以製作過渡動畫,狀態控制,自定義控制項,對於 XAML 的使用達到淋漓精緻,讓人髮指的程度)

cocosbuilder + spritebuilder 開發跨平台遊戲 2年+ (使用情況同 XAML)


從抽象的角度來看,純代碼是很有優勢的,利於抽取代碼和拓展。堅持純代碼可以鍛煉抽象的意識,還有學會如何封裝代碼,更便於了解控制項的執行流程,這對學習中的人來說是大有益處的。熟練的封裝能力和抽象意識可以讓你效率更高,如果你不能從純代碼中獲得任何益處,只剩煩擾,那麼就請使用Sb吧。


大公司用的很少是最新最省事的技術的


tableViewCell 和 collectionViewCell 千萬不要用約束布局,用 nib 或者 SB 好處就是可以很方便地寫自動約束布局,但是涉及重用的視圖或者視圖界面元素超級多的時候千萬不要用可視化工具編輯界面布局。自動約束布局在超過一定約束數量之後會降低 FPS。

看圖,到了60多個視圖的時候,使用自動約束布局就會卡頓了。而 Frame 布局則不會。

但是!

但是!

但是!

純代碼寫幾十個界面的時候會有想死的心呀,怎麼辦,這時候就要藉助開源的布局框架啦,我推薦 FlexBoxLayout,看圖:

FlexBoxLayout 的效率跟 Frame 布局的差不多。

給出學習鏈接:

CocoaChina :Flexbox優化 - CocoaChina_讓移動開發更簡單

flexBox語法:Flex 布局教程:語法篇 - 阮一峰的網路日誌

github:LPD-iOS/FlexBoxLayout

順便推一下自己的博客:【felxboxlayout】製作即時通訊聊天框


個人感覺從快和高效還有穩定性上取一個平衡的話 就nib吧


用的xib,自動布局很方便


別的公司不知道,我現在用xib.偶爾也會用代碼,不過已經非常少了.

xib適配6跟6p多舒服啊


自己遇到的幾家大公司還是以xib為主,因為很多2B的項目後期維護還是xib方便些。


我個人感覺,看情況吧,目前我ib 代碼都用


總之,蘋果推行的技術,你和他背道而馳,遲早要吃虧,有時候該適應的要適應。


第一名答案還是14年寫的,現在看來,SB才是未來。


2014年7/9月在華為做實習時,公司的一個app項目組正在從代碼逐步向storyboard轉型,簡單的模塊用後者實現,大部分還用代碼,他們說後者是趨勢。


推薦閱讀:

如何看待 WWDC 2016 上推出的 Swift Playgrounds?
為什麼安卓不採用墓碑機制?
Windows Phone 7 系統的使用體驗,相對 Android 和 iOS 來說,有哪些優劣之處?
為什麼安卓不採用推送(push notification)這種優雅,省資源的通知方式呢?
iOS 8.1.2 到 iOS 8.1.3 有什麼變化?升級好不好?

TAG:iOS | iOS開發 | storyboard |