以前在入门的时候,找的入门书籍上编写的 demo 都是基于 Storyboards 拖界面的。后来接触公司项目,发现界面都是用纯代码去写复杂的 autoLayout 的。再然后,领导给我发了个 Masonry 库去看,依然是手写代码布局界面,但效率高了不少。工作一段时间,看了很多博客,也看了一些书,发现用纯代码写界面的很少,于是就在 Google 上搜 Storyboards 有什么好处,最后发现了一篇非常好的文章。在此提炼文章的一些观点,同时表达一下自己的观点。

文章链接:iOS User Interfaces: Storyboards vs. NIBs vs. Custom Code
文章介绍了三种构建界面的方法,并对不同方法分别讨论了优缺点。

其实对于这几种方法,没有最好,只有最适合。

总结下来就是 Storyboards 是一个容易观察并且使用简单的 iOS UI 设计工具。它也消除了固定的创建控件的模板代码,但导致了很严重的灵活性的缺失。NIBs 对于 single view 来说提供了很大灵活性,但没有视觉流(个人猜测是 view controller 的切换)。灵活性最大的方案就是纯代码布局,但纯代码并不是那么直观,也没有那么容易。

同样的话题,在唐巧的博客里,也讨论过这个问题:iOS 开发中的争议(二)

其中比较有说服力的一段是他分析了100多个 App 包含 xib 文件的个数,大概推测出很多著名的 App 里大部分界面都是手写来完成的。

同时他也提出了自己的建议:

  • 对于复杂的、动态生成的界面,建议使用手工编写界面。
  • 对于需要统一风格的按钮或UI控件,建议使用手工用代码来构造。方便之后的修改和复用。
  • 对于需要有继承或组合关系的 UIView 类或 UIViewController 类,建议用代码手工编写界面。
  • 对于那些简单的、静态的、非核心功能界面,可以考虑使用 xib 或 storyboard 来完成。

呐最后我个人也是偏好使用纯代码布局的,并不是因为我一直是这么做的,而是有以下原因:

  1. 纯代码布局最让人诟病的就是代码量太大,的确,我之前用 autoLayout 的时候每写一个 constrains 就要好几行代码,一个控件有几个约束关系的话就要写几个 constrains,这个代码量一下就上去了。但现在有开源的 Masonry 库,对于 Swift 也有相应的库,所以对于代码量以及学习难度来讲,纯代码布局这部分的缺陷完全能够被弥补。
  2. 纯代码写的界面容易控制,这个容易控制是说,你每增加一个控件,一个约束在代码上就可以很直观的显示出来,因为每写一行代码你自己就会很清楚。而对于 Storyboards 来讲,控件的属性界面密密麻麻一大片,不管你改不改,那些数据都显示在那里,有时候你忘记改了哪些东西你都会在属性栏里一个一个去找。比如我把 view 的背景色从 grayColor 改成了 lightGrayColor,那我从代码上就可以很直观的看到这一句 view.backgroundColor = [UIColor lightGrayColor],但如果在 Storyboards 里,我就要去找背景色这一栏,还要分辨出灰色和浅灰色。
  3. 最后,就是代码的复用。比如写一个复杂的 tableViewCell ,用 Storyboards 去拖界面的话,就会看到视图上面有一堆控件和布局,如果我想在哪天复用这个 cell 并做一些布局修改的话,便又要重新拖放,如果有响应事件的话,还要重新给新建的类连线,想想这个工作量,不出错都难。而对于手写界面来说,写一个控件就封装在一个类里面,需要复用了,继承一下或者复制粘贴到别的工程即可使用,就算有响应事件,写几个 protocol 做反馈就解决了。
  4. 最最后,我想起来以前上学搞 MFC 的时候,那时候也有关于手写界面还是拖界面的讨论,当时一个很有说服力的评论是,手写界面可以锻炼你对 MFC 程序的理解,可能你还是无法知道 MFC 的实现原理,但你会很熟悉 MFC 的实现过程(大概是这意思)。这一点我觉得在 iOS 上也适用。比如说按钮事件,用 Storyboards 就是鼠标一拖,连一条线出来,系统就生成了一段事件代码,而你只要填代码就可以。我觉得这对于学习 iOS 不是一件好事情,虽然说我现在也不是非常了解 iOS 底层的一些实现原理,但通过手写界面,手动添加事件,我知道这些东西是怎么添加的,添加的东西和其他类之间的关系是什么。所以手写界面对学习 iOS 还是有一些帮助的。

[iOS]创建界面方法的讨论的更多相关文章

  1. iOS创建界面方法的讨论

    以前在入门的时候,找的入门书籍上编写的 demo 都是基于 Storyboards 拖界面的.后来接触公司项目,发现界面都是用纯代码去写复杂的 autoLayout 的.再然后,领导给我发了个 Mas ...

  2. 如何让iOS 保持界面流畅?这些技巧你知道吗

    如何让iOS 保持界面流畅?这些技巧你知道吗   作者:ibireme这篇文章会非常详细的分析 iOS 界面构建中的各种性能问题以及对应的解决思路,同时给出一个开源的微博列表实现,通过实际的代码展示如 ...

  3. 【转】iOS保持界面流畅的技巧

    原文链接:iOS保持界面流畅的技巧 这篇文章会非常详细的分析 iOS 界面构建中的各种性能问题以及对应的解决思路,同时给出一个开源的微博列表实现,通过实际的代码展示如何构建流畅的交互. Index演示 ...

  4. iOS常用公共方法

      iOS常用公共方法 字数2917 阅读3070 评论45 喜欢236 1. 获取磁盘总空间大小 //磁盘总空间 + (CGFloat)diskOfAllSizeMBytes{ CGFloat si ...

  5. fir.im Weekly - iOS 保持界面流畅的技巧

    生命不息,coding 不止.本期 fir.im Weekly 收集了微博上的热转资源,包含 Android.iOS 开发工具.源码分享,产品 UI 设计的好文章,还有一些程序员成长的 Tips,希望 ...

  6. Unity3D与iOS消息交互方法(1)--iOS接收Unity3D发出的消息

    跨平台这种事情不管多NB, 总要有些与原生系统交互的方法, 比如  Unity3D与iOS消息交互方法. 一: 建立一个空的Unity工程. File -->  New Project 二: 编 ...

  7. Cisco设备IOS的恢复方法 两种方法

    如果不小心把Router或者Switch的IOS删除了,特别是Flash中的IOS和ROM中的Mini IOS都没有了的话,连启动都不行的话,有什么方法恢复它呢?答案是方法不只一种,而是两种.其实是我 ...

  8. iOS 图片旋转方法

    iOS 图片旋转方法 通过 CGImage 或 CIImage 旋转特定角度 UIImage可通过CGImage或CIImage初始化,初始化方法分别为init(cgImage: CGImage, s ...

  9. iOS 常用公共方法

    iOS常用公共方法 1. 获取磁盘总空间大小 //磁盘总空间 + (CGFloat)diskOfAllSizeMBytes{ CGFloat size = 0.0; NSError *error; N ...

随机推荐

  1. Struts标签<bean:write><logic:iterate></logic:equal>的组合使用小例

    form表单中的一个下拉列表控件的代码如下 <select name="taskname" id="taskname" class="selec ...

  2. 如何测量并报告ASP.NET Core Web API请求的响应时间

    介绍 大家都知道性能是API的流行语.而相应时间则是API性能的一个重要并且可测量的参数.在本文中,我们将了解如何使用代码来测量API的响应时间,然后将响应时间数据返回到客户端. 作者:依乐祝 原文地 ...

  3. mysql 开发进阶篇系列 46 物理备份与恢复( xtrabackup的 选项说明,增加备份用户,完全备份案例)

    一. xtrabackup 选项说明 在操作xtrabackup备份与恢复之前,先看下该工具的选项,下面记录了xtrabackup二进制文件的部分命令行选项,后期把常用的选项在补上.点击查看xtrab ...

  4. 浅入浅出Typescript Decorators

    临时起的兴趣,想写一篇关于ts decorator的文章,就花小半天整理了一下...  这东西,在ES2017里好像也有... 文档的话看这里. 因为临时,就没想写太多文字介绍,带少许文字说明直接开撸 ...

  5. c#调用c++ dll的一个例子

    1.创建一个简单的c++ 项目生成动态库. Vs 创建完工程后,打开SampleOperation.cpp文件,看到有个导出函数的例子. 复制这段代码, 修改函数(返回值, 参数列表, 函数的实现) ...

  6. [转]phpredis中文手册

    本文是参考<redis中文手册>,将示例代码用php来实现,注意php-redis与redis_cli的区别(主要是返回值类型和参数用法). 目录(使用CTRL+F快速查找命令): Key ...

  7. 流式大数据计算实践(1)----Hadoop单机模式

    一.前言 1.从今天开始进行流式大数据计算的实践之路,需要完成一个车辆实时热力图 2.技术选型:HBase作为数据仓库,Storm作为流式计算框架,ECharts作为热力图的展示 3.计划使用两台虚拟 ...

  8. Perl检查引用类型

    有时候可能会需要检查引用是什么类型的,免得我们期待是一个数组引用,却给了一个hash引用. ref函数可以用来检查引用的类型,并返回类型.perl中内置了如下几种引用类型,如果检查的不是引用,则返回u ...

  9. fiddler抓取https请求(android/ios)

    本文转载自:http://blog.csdn.net/songer_xing/article/details/53841401 备注:本人有这样的一个需求,先记录下,以后再进行整理. 在抓包过程中发现 ...

  10. 使用.Net Core 2.1开发Captcha图片验证码服务

    更新后续篇:Captcha服务(后续1) 使用.Net Core 2.1开发Captcha验证码服务 开发工具:Visual Studio 2017 15.7.3 开发平台:64位 Windows 1 ...