摘要:對于大多數開發者而言,Storyboard為快速開發所帶來直接價值是不可抹滅的。但對一些開發者及代碼潔癖者來說,卻會使其代碼及配置相對臃腫或引來不必要的麻煩,那么,iOS開發究需不需要Storyboard?
當我在Xcode中創建一個新的iOS項目,無論它是iPhone/iPad設備獨占還是universal的,我做的件事總是刪除Storyboard。并且,和你們想象的不同,我并不是想用XIB來代替Storyboard,我完全不使用Interface Builder。
Treehouse論壇對此有很棒的討論,并且我聽到的說法總是類似:Interface Builder會鼓勵做出壞的實踐。因為我之前有在Window平臺使用Visual Studio開發的經驗,我可以很自信的說,Interface Builder非常不好,至少與VS比較是這樣。Visual Studio之所以更,其原因之一在于標記式語言(XAML),它能被設計師使用,就像HTML相對于Web一樣。
不管怎么說,讓我們回到iOS上來。
使用Interface Builder壞的地方是,它讓分解視圖塊以及從視圖控制器(view controller)使用視圖的工作大大增加了。它的后果是導致出現體積臃腫的視圖控制器,而這是應該避免的,并且它們編輯起來簡直是一個噩夢。
即使你做了這些多出來的工作,并且提取出部分UI到可重用的視圖里,你在Interface Builder里看到的將是一個個白色塊,里面包裹著可重用視圖,但你不能直觀的看到它們。
另一個問題是outlets,在合并的時候它們可能偶然的斷開連接,或者如果你在重用視圖時忘記連接它們,你的應用會崩潰。
有些人可能會爭論說,當面臨屏幕適配問題時,使用Auto Layout和IB結合是一種好的解決辦法。這一點我仍然不同意——首先我認為在IB中管理布局約束是噩夢,使用拖拽很難將視圖調整到精確的位置,元素會突然對齊到鄰近的視圖,并且當你添加多個box時,它們的層級順序會打亂并且改變其它box。
與此對應的是,在Github上有不少Auto Layout的擴展,如Masonry、Snappy、PureLayout、Cartography等,能夠幫你省卻不少功夫。在將你的子視圖實例化到視圖控制器之后,你僅需要重寫updateConstraints并設置約束條件,即可完成不同尺寸屏幕的適配。比如下面的示例使用了PureLayout庫:
updateConstraints.swift
[cpp] view plaincopy在CODE上查看代碼片派生到我的代碼片
override func updateConstraints() {
super.updateConstraints()
self.buildStatusIndicatorView.autoPinEdgesToSuperviewEdgesWithInsets(UIEdgeInsetsZero, excludingEdge: ALEdge.Trailing)
self.buildStatusIndicatorView.autoSetDimension(ALDimension.Width, toSize: 10)
self.buildNumberLabel.autoPinEdgesToSuperviewEdgesWithInsets(UIEdgeInsets(top: 5, left: 15, bottom: 5, right: 5), excludingEdge: ALEdge.Bottom)
self.buildNumberLabel.autoSetDimension(ALDimension.Height, toSize: 23)
self.branchLabel.autoPinEdge(ALEdge.Top, toEdge: ALEdge.Top, ofView: self.contentView, withOffset: 10)
self.branchLabel.autoPinEdge(ALEdge.Trailing, toEdge: ALEdge.Trailing, ofView: self.contentView, withOffset: -10)
self.commitMessageLabel.autoPinEdge(ALEdge.Top, toEdge: ALEdge.Bottom, ofView: self.buildNumberLabel, withOffset: 10)
self.commitMessageLabel.autoPinEdgeToSuperviewEdge(ALEdge.Leading, withInset: 15)
self.commitMessageLabel.autoPinEdgeToSuperviewEdge(ALEdge.Bottom, withInset: 5)
self.commitMessageLabel.autoConstrainAttribute(ALAttribute.Width, toAttribute: ALAttribute.Width, ofView: self.contentView, withOffset: -20)
}
對于表格視圖需要計算每個單元格的高度,以達到根據Auto Layout約束條件自動調整大小,代碼可以很直觀的完成這一點。特別是當iOS 8引入了UITableViewAutomaticDimension選項之后。
英文文章來源:Martin Normark's Blog,譯文出自:idlelife,譯者:pockry
本站文章版權歸原作者及原出處所有 。內容為作者個人觀點, 并不代表本站贊同其觀點和對其真實性負責,本站只提供參考并不構成任何投資及應用建議。本站是一個個人學習交流的平臺,網站上部分文章為轉載,并不用于任何商業目的,我們已經盡可能的對作者和來源進行了通告,但是能力有限或疏忽,造成漏登,請及時聯系我們,我們將根據著作權人的要求,立即更正或者刪除有關內容。本站擁有對此聲明的最終解釋權。