ios - 你使用 Autolayout 是使用 Storyboard 设置约束,还是使用代码写约束?
怪我咯
怪我咯 2017-04-17 13:24:04
[iOS讨论组]

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

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

怪我咯
怪我咯

走同样的路,发现不同的人生

全部回复(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 也是个不错的选择。

巴扎黑

用代码写会疯掉的,用storyboard代码能实现的它都能实现。
这里有几个地址你可以参考一下

  1. raywenderlich
  2. 这个是raywenderlich翻译过来的
  3. 这个是onevcat写的
PHP中文网

纯代码,用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,很容易就恍惚了刚刚改了什么(也可能是我脑残片忘了吃了)。

PHPz

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 方便快速

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号