你使用 Autolayout 是使用 Storyboard 设置约束,还是使用代码写约束?

写布局规则写到吐了,但是对 Storyboard 来设置约束总感觉没安全感,而且很多约束不知道该怎么在界面上描述

你现在项目中是使用 Storyboard 来设置约束的还是代码?有没有好的 Storyboard 来设置约束的教程推荐?

阅读 17.8k
7 个回答

先说个人看法:具体情况具体分析,该用什么用什么。脱离具体使用场景的讨论都是耍流氓。

AutoLayout可以解决你很多约束需求,你有什么需求是AutoLayout实现不了的可以通过代码调整,不过情况很少的。。。举个例子看看?


12-05 更新

回应一下 @NSFish 的回答。

多个storyboard和xib里的字体、控件背景如何统一控制。 比如标题都是14,颜色为0X999999这样,用代码设置一个global config之类的地方读取即可,用IB不知道要怎么做。
storyboard中的viewController的重用问题。

这种统一控件不应该用基类来做吗?比如整个应用所有按钮字体都是14号字,如果有1000个按钮你就多了1000行设置格式的代码?这种无意义代码不应该尽量减少吗?如果我又要加上背景颜色,那你岂不是要找到这1000个按钮然后挨个加上背景颜色?累不累。。。

XIB 是可以设置基类的 (custum class),而且利用 run time attr 标签可以设置一些运行时属性,比如圆角,投影之类。我觉得这种代码属于 无意义重复代码 ,如果能减少是最好的。

storyboard中似乎是无法直接制作view的,而必须要放入viewController中,以体现storyboard“scene”的意义,这不难理解。但在storyboard里做了一个容器viewController A(比如说,一个类网易新闻的横向标签条和一个scrollView的组合),想要作为基类来使用,同一个storyboard里使用A的派生类B,B中所有的控件都没有初始化,似乎是storyboard并不认可这样使用,让人有些困扰。

storyboard 是故事版,你见过在链表里面插入一个字符串的吗,显然应该加个节点啊。。。

这种情况如果想用 xib 可以新建 xib 文件并建立关联即可。至于你说的初始化的问题,没看懂你想说什么,建议先了解一下 view 的生命周期和 xib 的加载流程。

后面的我不想说太多了,时间有限,如果有了问题建议先google一下,比如:

Using xib object inside another xib

我觉得能解决你的很多困惑。

还是那句话,具体问题具体分析。很多场景确实不适合使用 Storyboard (比如我要写个基类继承 UIButton 然后有一些自己的默认属性比如字体颜色什么的),但是绝大部分场景是推荐使用 XIB 的。看你怎么用了。

当然 Masonry 也是个不错的选择。

纯代码,用masonry,很快,极快,让我直接扔掉了自己封装的一套垃圾。
Storyboard和Xib用了一段时间,产生了很多困惑和问题,最终在公司现在的项目上放弃了。这里列举3个,希望IB达人指正。

  • 多个storyboard和xib里的字体、控件背景如何统一控制。 比如标题都是14,颜色为0X999999这样,用代码设置一个global config之类的地方读取即可,用IB不知道要怎么做。
  • storyboard中的viewController的重用问题。
    storyboard中似乎是无法直接制作view的,而必须要放入viewController中,以体现storyboard“scene”的意义,这不难理解。但在storyboard里做了一个容器viewController A(比如说,一个类网易新闻的横向标签条和一个scrollView的组合),想要作为基类来使用,同一个storyboard里使用A的派生类B,B中所有的控件都没有初始化,似乎是storyboard并不认可这样使用,让人有些困扰。
  • xib写就的view的重用问题。
    在storyboard中的某个viewController或者一个xib文件中拖入另一个xib文件写就的view
    A,在初始化完成后,发现A中所有的outlet都为nil,似乎根本没有去加载对应的xib。要正常使用,目前我只能通过代码来加载。这一点是我最终放弃的主要原因,即使有办法能够做到,但如此符合直觉的做法却是无效的,仍然让人有些上火。

以上。

补充一下,刚好在大屏iPhone出来的时候加入了现在的公司,从头拉起一个项目,直接用iOS8.1的SDK,在autolayout上真是吃了不少苦头。我觉得不论用IB还是用代码,autolayout本身的使用最终都不会有多大问题,真正的坑其实是autolayout的兼容性问题。我遇到了不少在iOS8下正常工作,但在iOS7下crash或卡viewDidLayoutSubviews无限循环的bug,绕过去花了大量时间。相比同时间android组的开发速度。。。。。有时候是会有点转行的冲动的。。

再补充一下,autolayout的debug在刚开始的时候是非常痛苦的,基本只能根据console里的一大排错误信息慢慢做排除法。用纯代码写约束的一个巨大好处是,暂时地移除部分约束(注释即可),或添加测试约束(用Debug_constraint_only之类的宏控制即可)非常容易,而在IB里做则非常痛苦。一是要反复地进出各个view层级来install/uninstall,二是面对复杂的UI,很容易就恍惚了刚刚改了什么(也可能是我脑残片忘了吃了)。

storyboard,妥妥的

用Storyboard设置会比较方便,但是复杂的应用程序例如要求添加动画的话。
可以同Animate Constraints来改变。

现在3.5寸,4寸,4.7寸,5.5寸以及iPad、Apple Watch这么多尺寸的屏幕共存,使用代码布局就显的捉襟见肘了,且不说效率,容错率就很低。而且WatchKit压根不允许你使用代码布局,说明Apple逐渐有规避代码布局的趋势。建议还是系统的学习Storboard、AutoLayout、Size Classes三大利器。
这里介绍两篇外国的译文,可以参考一下:
Swift自适应布局(Adaptive Layout)教程

为iPhone6设计自适应布局

storyboard 方便快速

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题