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 选项以后。