文档章节

为什么iOS开发不需要Storyboard

木木情深
 木木情深
发布于 2015/01/07 14:19
字数 842
阅读 258
收藏 0

no-storyboard-story.png

当我在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里看到的将是一个个白色块,里面包裹着可重用视图,但你不能直观的看到它们。(译者注:根据网友指出,最新版的Xcode已经能看到了)


另一个问题是outlets,在合并的时候它们可能偶然的断开连接,或者如果你在重用视图时忘记连接它们,你的应用会崩溃。


有些人可能会争论说,当面临屏幕适配问题时,使用Auto Layout和IB结合是一种好的解决办法。这一点我仍然不同意——首先我认为在IB中管理布局约束是噩梦,使用拖拽很难将视图调整到精确的位置,元素会 突然对齐到邻近的视图,并且当你添加多个box时,它们的层级顺序会打乱并且改变其它box。


与此对应的是,在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 选项之后。


本文转载自:http://www.cocoachina.com/ios/20150106/10854.html

下一篇: 本地化误区
木木情深
粉丝 37
博文 189
码字总数 26451
作品 0
广州
程序员
私信 提问
加载中

评论(4)

二笔小青年
二笔小青年
79
木木情深
木木情深 博主

引用来自“宋鸿康”的评论

现在老程序员都不用故事板,我真想不通是为什么?

storyborad 不利于模块化,太复杂的界面不好优化维护,太炫的效果没有代码灵活。仅代表一个初学者的观点啊,呵呵。。。
二笔小青年
二笔小青年
现在老程序员都不用故事板,我真想不通是为什么?
二笔小青年
二笔小青年
傻逼,
iOS开发需要了解的基础内容链接整理

https://llvm.org/svn/llvm-project/cfe/trunk/test/SemaObjC/builtinobjcnslog.m http://llvm.org/klaus/clang/commit/5faf5d31fa634e1fdb576c4d9708cd4efa5ea310/ 对Objective-C的NSObjec......

智能小松鼠
2015/01/14
301
2
使用 Interface Builder 兼容 iOS6 和iOS7

当你在更新你的App到iOS 7的平台时遇到最大的挑战之一就是确保不要遗忘那些还在使用iOS 6平台的用户,在此我们提供一些建议使你的App应用在iOS 6和iOS 7上同时保留视觉吸引力和技术功能. 此图...

isaced
2014/01/15
13.4K
12
Getting iOS Done 1.1从label开始,前面是星辰大海

1 最初 ### 1.1 label的使用 #### iOS的第一个控件无疑是UILable,iOS中创建一个标签主要有两种方式:一种是以storyboard或者是xib文件方式进行描述,和对应的UIViewController进行绑定之后在...

TC-tomCute
2014/03/02
89
0
将 75000 行原生 iOS 应用程序移植到 Flutter 后,结果太惊讶!

澳大利亚有一个名为Easy Diet Diary的原生iOS应用程序。 该应用: • 已被下载120万次; • 用Objective-C和Swift编写,后端是Amazon AWS; • 代码统计工具CLOC,报告该应用包含75,000行代码...

CSDN资讯
2018/10/22
0
0
一步一步学习iOS 5编程(第三版)-PDF中文版-正式发布!

目前,这是第一本介绍iOS 5.x 和 Xcode 4.4 的中文版书籍,尤其适合于iOS 编程开发初学者。本教程由 EntLib.com 团队编写。如有任何技术问题,欢迎留言。 电子版 – PDF 格式,支持iPhone、i...

entlib
2012/09/20
800
2

没有更多内容

加载失败,请刷新页面

加载更多

java发送html模板的高逼格邮件

最近做了一个监测k8s服务pod水平伸缩发送邮件的功能(当pod的cpu/内存达到指定阈值后会水平扩展出多个pod、或者指定时间内pod数应扩展到指定数量),一开始写了个格式很low的邮件,像下面这样...

码农实战
16分钟前
6
0
php-fpm配置文件详解/MariaDB密码重置、慢查询日志

来源:https://blog.csdn.net/Powerful_Fy php-fpm主配置文件路径:/usr/local/php-fpm/etc/php-fpm.conf #位于安装php安装目录下的etc/目录中,该文件中最后一行将配置文件指向:include=/...

asnfuy
21分钟前
4
0
川普给埃尔多安和内堪尼亚胡的信

任性 https://twitter.com/netanyahu/status/1186647558401253377 https://edition.cnn.com/2019/10/16/politics/trump-erdogan-letter/index.htm...

Iridium
42分钟前
12
0
golang-mysql-原生

db.go package mainimport ("database/sql""time"_ "github.com/go-sql-driver/mysql")var (db *sql.DBdsn = "root:123456@tcp(127.0.0.1:3306)/test?charset=u......

李琼涛
今天
5
0
编程作业20191021092341

1编写一个程序,把用分钟表示的时间转换成用小时和分钟表示的时 间。使用#define或const创建一个表示60的符号常量或const变量。通过while 循环让用户重复输入值,直到用户输入小于或等于0的值...

1李嘉焘1
今天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部