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

文章链接:iOS User Interfaces: Storyboards vs. NIBs vs. Custom Code

(https://www.toptal.com/ios/ios-user-interfaces-storyboards-vs-nibs-vs-custom-code)

文章介绍了三种构建界面的方法,并对不同方法分别讨论了优缺点。

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

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

同样的话题,在上一篇唐巧老师的文章里,也讨论过这个问题:iOS 开发中的争议(二)

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

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

1、对于复杂的、动态生成的界面,建议使用手工编写界面。

2、对于需要统一风格的按钮或UI控件,建议使用手工用代码来构造。方便之后的修改和复用。

3、对于需要有继承或组合关系的 UIView 类或 UIViewController 类,建议用代码手工编写界面。

4、对于那些简单的、静态的、非核心功能界面,可以考虑使用 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. python学习之--内置函数:

    Python内置函数: Python内置了很多有用的函数,我们可以直接调用.要调用一个函数,需要知道函数的名称和参数,比如求绝对值的函数abs,只有一个参数. 1. 内置函数调用之--abs()函数: ...

  2. bzoj 3283: 运算器 扩展Baby Step Giant Step && 快速阶乘

    3283: 运算器 Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 184  Solved: 59[Submit][Status][Discuss] D ...

  3. jquery之ajaxfileupload异步上传插件

    点我下载工程代码由于项目需求,在处理文件上传时需要使用到文件的异步上传.这里使用Jquery Ajax File Uploader这个组件下载地址:http://www.phpletter.com/d ...

  4. IIS tomcat共用80端口解决一个IP多个域名:使用Nginx反向代理方式使两者兼容

    环境: windows server 2003,IIS6服务器,Tomcat7服务器 域名有几个: 以下是使用IIS的域名: http://www.formuch.com/ http://www.fo ...

  5. Activity的启动过程

    详见: http://www.cloudchou.com/android/post-805.html

  6. 【HDOJ】3234 Exclusive-OR

    并查集.对于对元素赋值操作,更改为I p n v.令val[n]=0(任何数与0异或仍为原值).考虑fa[x] = fx, fa[y] = fy.如果使得fa[fx] = fy, 那么val[fx] ...

  7. Learning WCF Chapter2 WCF Contracts and Serialization

    So far I’ve talked about the standards behind it all,but in fact WCF hides most of this from the dev ...

  8. 在windows下解压缩Linux内核源代码出现重复文件原因

    在windows下解压缩Linux内核源代码出现重复文件原因 2009年06月30日 13:35 来源:ChinaUnix博客 作者:embededgood 编辑:周荣茂     原因一.因为在Lin ...

  9. [C# 网络编程系列]专题三:自定义Web服务器

    转自:http://www.cnblogs.com/zhili/archive/2012/08/23/2652460.html 前言: 经过前面的专题中对网络层协议和HTTP协议的简单介绍相信大家对网 ...

  10. 使用jenkins + python + selenium一步步搭建web自动化测试“框架”(1) - 各部件简介

    原先搭建过一个自动化测试框架,迷迷糊糊不求甚解,算是搭建了一个仅限于能用的.根本算不上框架的玩意儿. 现在回过头来好好看看究竟每一步是怎么联系起来的,是怎么运行起来的. 本次博客先说说各部件都是干什么 ...