爲何iOS開發不須要Storyboard

no-storyboard-story.pngweb

當我在Xcode中建立一個新的iOS項目,不管它是iPhone/iPad設備獨佔仍是universal的,我作的第一件事老是刪除Storyboard。swift


而且,和大家想象的不一樣,我並非想用XIB來代替Storyboard,我徹底不使用Interface Builder。app


Treehouse論壇對此有很棒的討論,而且我聽到的說法老是相似:Interface Builder會鼓勵作出壞的實踐。ide


由於我以前有在Window平臺使用Visual Studio開發的經驗,我能夠很自信的說,Interface Builder很是很差,至少與VS比較是這樣。Visual Studio之因此更優秀,其緣由之一在於標記式語言(XAML),它能被設計師使用,就像HTML相對於web同樣。佈局


無論怎麼說,讓咱們回到iOS上來。ui


使用Interface Builder最壞的地方是,它讓分解視圖塊以及從視圖控制器(view controller)使用視圖的工做大大增長了。它的後果是致使出現體積臃腫的視圖控制器,而這是應該避免的,而且它們編輯起來簡直是一個噩夢。設計


即便你作了這些多出來的工做,而且提取出部分UI到可重用的視圖裏,你在Interface Builder裏看到的將是一個個白色塊,裏面包裹着可重用視圖,但你不能直觀的看到它們。(譯者注:根據網友指出,最新版的Xcode已經能看到了)code


另外一個問題是outlets,在合併的時候它們可能偶然的斷開鏈接,或者若是你在重用視圖時忘記鏈接它們,你的應用會崩潰。開發


有些人可能會爭論說,當面臨屏幕適配問題時,使用Auto Layout和IB結合是一種好的解決辦法。這一點我仍然不一樣意——首先我認爲在IB中管理佈局約束是噩夢,使用拖拽很難將視圖調整到精確的位置,元素會 忽然對齊到鄰近的視圖,而且當你添加多個box時,它們的層級順序會打亂而且改變其它box。it


與此對應的是,在Github上有很多Auto Layout的擴展(如Masonry、Snappy、PureLayout、Cartography),能幫你節省很多功夫。在將你的子視圖實例化到視圖控制器以後,你僅須要重寫updateConstraints並設置約束條件,便可完成不一樣尺寸屏幕的適配。好比下面的示例使用了PureLayout庫:


updateConstraints.swift


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 選項以後。

相關文章
相關標籤/搜索