这是一本详细讲解如何使用 Interface Builder 的书籍,主要讲解如何利用 Interface Builder
快速、高效地开发 UI。本书从 Interface Builder 菜单、UIKit 控件这些基础知识到如何使用
Interface Builder 鲜为人知的高级功能、如何利用 Interface Builder 进行代码的优化等都进行
了详细讲解,内容覆盖了利用 Interface Builder 开发 UI 所涉及的各个知识点。除此之外,本
书还着重介绍了经常与 Interface Builder 配合使用的 Auto Layout,以及很多与 UI 学习甚至与
iOS 开发学习相关的知识。
本书理论与实践相结合,理论部分全面而且深入,让读者知其所以然,实践部分不仅讲
到了在开发中经常遇到的情况,而且也关注了一些非常重要的细节。本书适合想快速、高效
地开发 UI,想学习 Interface Builder 的各个层次的开发人员阅读,对于 iOS 的 UI 学习来说,
本书也具有很强的指导意义。
首本讲解Interface Builder相关知识的书籍,onevcat、sunnyxx、靛青K等资深iOS开发者推荐。
前言
iOS系统在移动互联网如火如荼、方兴未艾的发展中有着举足轻重的地位,iOS开发也成为近几年比较热门的行业。UI开发是iOS开发中重要的一部分,不仅负责信息的展示,还可以与用户交互,直接体现出应用程序的“颜值”,影响着用户体验,所以说UI开发相当重要。对于已开发的应用程序,用户并不关心开发人员用了哪些技术和解决方案,只关心页面做得是否好看,交互操作是否顺手,滑动时会不会卡,这些都与UI开发息息相关。在实际的开发工作中,UI开发往往占据了大部分的时间和精力。而我们所追求的是快速开发UI,把主要精力放在业务逻辑上,这也是苹果公司所希望的,因此,苹果公司将Interface Builder作为UI开发的“大杀器”,并在逐步地改良。这本书讲的就是如何利用Interface Builder高效、优雅地开发UI。
写作的动机
从技术角度来讲,UI开发主要有两种方式:
1. 利用代码开发。
2. 利用可视化开发工具——Interface Builder开发。
在实际的工作中,大部分情况是将两种方式结合使用。但是在国内,Interface Builder的应用相对于国外来说并不是特别广泛,使用的场景相对简单,使用的技术也比较浅,并没有展示出Interface Builder强大的功能和应有的价值。Interface Builder在国内是一项被低估的技术。在2015 年苹果全球开发者大会(WWDC )的“What's New in Storyboard”会场中,苹果公司的演讲嘉宾现场统计了使用Interface Builder开发者的人数,从他的言语中可以推测,当时国外开发者中使用Interface Builder的比例已经相当高了。从侧面可以看出,在iOS开发上,我们和国外的开发者还有一定的差距。
随着4.0英寸、4.7英寸、5.5英寸iPhone手机的出现,适配成了UI开发中很烦琐的一件事情,对于要适配横屏、竖屏或iPhone、iPad通用的应用程序尤为如此。利用Interface Builder + Auto Layout + Trait Variations可以十分简单、高效地解决这个问题。苹果公司每个新版本的Xcode都会对Interface Builder进行相应的功能升级,而且从苹果公司每年在WWDC上推出的新技术来看,很多是与Interface Builder相关的。这也说明,使用Interface Builder是UI开发的大势所趋。
在程序员看来,没有什么自动化是一个脚本解决不了的,如果有,那就是再写一个脚本。但通常来说,程序员都喜欢追求效率,而Interface Builder对开发效率的提升无疑是巨大的。
笔者希望通过这本书能够让国内的开发者重新认识Interface Builder,对Interface Builder产生浓厚的兴趣,最后达到精通Interface Builder的目的。同时希望开发者能将其更多地应用到实际开发中,提高自己的工作效率,从而更加从容地面对互联网行业紧张、快速的节奏。笔者不才,如果本书对你来说没能达到期望的效果,那么只希望它能对你学习Interface Builder起到一个抛砖引玉的作用。
本书的特点
本书的特点如下。
1. 细致。本书每个知识点的讲解都力争做到细致,让Interface Builder零基础的iOS开发者可以在入门时更加从容。如果你是有一定Interface Builder基础的开发者,那么可以略过一些自认为琐碎的细节,以免浪费宝贵的时间,但是如果你有兴趣了解这些细节的话,也一定会有所收获,它会让你更加系统、更加深刻地掌握Interface Builder。
2. 全面。本书的讲解也力争做到全面,让读者可以掌握Interface Builder开发中的各种技巧,了解各个细节,并能够系统地掌握Interface Builder相关的原理。由于Interface Builder相关知识碎片化严重,体系化不明显,如果只学习在开发过程中的应用技能,不深入理解一些原理,那么在一段时间不用之后很容易遗忘,只有掌握了相关的原理,理论配上实践,才能全面地掌握它。
3. 深入。本书在介绍Interface Builder的基础知识和基本使用之后,加入了大量的进阶内容,包括有些章节中的“深入学习”和“Interface Builder进阶”。这些内容绝对能在Interface Builder开发中起到至关重要的作用,相信会改变你对Interface Builder原有的认识,虽然这里介绍的很多Interface Builder的应用技巧并没有在开发中得到普遍使用,但是它们的确很方便、实用。如果能掌握这些深入的知识和技巧,那么在利用Interface Builder开发时一定会变得更高效、更优雅。
4. 拓展。与此同时,本书加入了一些iOS开发中的其他知识点,一部分穿插在整本书中,另一部分则以“拓展学习”章节的形式出现,用于配合Interface Builder的讲解。Interface Builder开发与iOS其他方面的开发并不是孤立的,实际上学习Interface Builder时,需要具备很多iOS其他方面的知识,这些知识可以让读者学习Interface Builder时更轻松,更便于理解,同时也能学习得更深入。拓展部分的内容包括iOS开发中的一些基本原理和应用细节,例如App启动流程分析、UIApplication自定义、iOS开发中的内存管理、SDK开发应该掌握的一些技巧等,还包括其他方面的一些内容,例如CocoaPods和“黑魔法”——如何实现在低版本中使用高版本中才存在的类等,这些内容对大家学习Interface Builder之外的iOS开发知识非常有帮助。
5. 实用。本书还会介绍一些细节,这些细节虽然很小,但是在开发中却很重要,也很实用。其中很多都是笔者自己踩过的“坑”,本书介绍的这些细节可以帮助读者避开这些“坑”,也可以从笔者个人的经验中学到一些东西。本书的最后还会介绍一些Interface Builder开发中的小技巧和笔者在使用Interface Builder时遇到的一些bug,相信这些实用的内容会给读者带来帮助。
内容的组织
本书一共分为7章。
第1章主要介绍Interface Builder、xib、Bundle、sb、nib、storyboardc等内容,理解这些内容是系统学习Interface Builder的基础。这些内容决定了理解和掌握Interface Builder的深度,所以非常重要。除此之外,第1章还介绍了Interface Builder的优缺点及其学习的特点,了解优缺点便于大家更好地使用它,同时也有利于项目中UI开发的技术选型,便于更快速地掌握它。本章最后介绍了iOS开发中的依赖管理工具——CocoaPods。
第2章首先讲解如何有效地解决Interface Builder文件的冲突。文件的易冲突是很多开发者拒绝使用Interface Builder的一个重要理由,所以本章解决了这些开发者的担忧。然后介绍如何创建并使用各种Interface Builder文件,由于在不同情况下创建和使用方式不同,所以有些细节需要特别注意。本章还讲解了Interface Builder文件与源文件的“关联”、与源文件建立@IBOutlet和@IBAction“连线”等一些基本而又重要的操作,这些操作在平时开发中经常被使用。另外还会介绍Bundle的创建,这对开发SDK很有帮助。除此之外,还介绍了App启动过程的分析和自定义UIApplication,它可以帮助大家理解App启动后是如何与代码关联的。
第3章对xib进行了全面的讲解,包括Utilities中的每个检查器菜单、各个菜单中的重要标签、控件栏中的重要控件、Show the Object library菜单(主要讲解了在xib中使用手势),以及在xib中使用tableView、tableViewCell、Asset Catalog等内容。这些都是Interface Builder开发的基础,是必须掌握的内容。
第4章将介绍Auto Layout在Interface Builder中的使用。Interface Builder的最大优势在于可以快速地开发UI,减少大量的“胶水”代码,其次就是利用Auto Layout可以高效、优雅地做适配,所以本章将详细地介绍Auto Layout在Interface Builder中的使用,讲解在不写代码的情况下,如何利用Interface Builder + Auto Layout满足产品经理刁钻的UI需求。本章首先会详细介绍Auto Layout相关的基础知识,包括Auto Layout的理解、如何正确设置约束等,然后介绍Interface Builder中Auto Layout的菜单,及其重要的标签,最后讲解Interface Builder中使用Auto Layout进行布局的实践。除此之外,还会介绍如何实现在低版本中使用高版本中才存在的类等拓展内容。
第5章全面讲解storyboard,介绍xib中没有的一些菜单和功能,其中重点讲解segue,包括常规的segue、自定义的segue、Embed Segue、Unwind Segue等,还有一部分重要的内容是在storyboard中使用tableView(包括静态tableView)和tableViewCell,这些内容都可以在xib的基础上再次提高开发效率,是storyboard的优势所在。
第6章是Interface Builder的进阶章节,主要包括用Trait Variations做适配、IB文件的加载过程、App的本地化、Storyboard Reference和RBStoryboardLink的使用、IB中Object与External Object的使用、IB中关键字的总结等内容,这部分都是在平时开发中用得比较少,但很实用的内容,有一些内容比较难理解,需要上面几章的基础知识作铺垫。
第7章介绍在Interface Builder开发中的一些技巧,帮助大家提高开发效率,并讲解笔者在Interface Builder开发中遇到的一些bug。
适合的读者
本书适合以下几类读者。
1.iOS入门开发者。
使用Interface Builder是iOS入门最简单的方式,它对快速学习并掌握UIKit有事半功倍的作用,同时Interface Builder也是UI开发的趋势所在。本书并不会介绍Objective-C、Swift等开发语言,也不会介绍Foundation、UIKit等基础类库及iOS基础知识,它不是那种“从入门到精通”的工具书,但是可以配合这本书,帮助开发者入门iOS。
2.不熟悉Interface Builder,在开发中也很少使用Interface Builder的iOS开发者。
本书介绍的基础知识可以让读者应对大部分与Interface Builder打交道的情况。可能有些开发者在开发中并不使用Interface Builder,但是如果开发团队中有人在使用Interface Builder的话,有这方面的知识会让团队合作更顺畅,也更容易熟悉工程中其他人写的代码。除此之外,现在在网上下载一个demo,几乎都是基于Interface Builder的,苹果公司官方的Demo更是这样,熟悉Interface Builder是适应开发大环境的需要。
3.想在Interface Builder上进阶的开发者。
很多人认为,Interface Builder很简单,很容易上手,根本没有可以深入学习的内容。其实,这是一种不正确的想法。Interface Builder的确很简单,很容易上手,但同时Interface Builder有很多功能并不被大多数开发者所知所用,例如,如何用Interface Builder简单地进行本地化?如何用Interface Builder优雅地实现VC间的回调传值?如何在Interface Builder菜单栏中显示一个类自定义的属性?甚至还有一些灵活的用法可以改变工程中类之间的依赖结构,一些高级的用法还可以优化工程架构,使架构更简单、耦合性更低。Interface Builder绝不仅仅停留在UI上,这里有很多内容值得大家去探索。
本书的约定
本书用UI特指User Interface——用户界面,包括与用户的交互行为,在某些语境下也指代UI设计师;用PM指代产品经理;用UE指代交互设计师。本书中提到的App特指在iOS系统上运行的一个应用程序——Application;提到的苹果特指苹果公司。
在接下来的学习中,会用IB指代Interface Builder;用sb指代storyboard。storyboard是一种文件的格式,可以理解为.storyboard格式的文件。所以,本书提到的sb就是指.storyboard格式的文件。同样,xib就是指.xib格式的文件。本书提到的IB文件就是指.xib文件和.storyboard文件。在本书中,用VC或viewController代表一个UIViewController子类的实例,在某些语境下也用页面代表VC,用view代表一个UIView类或其子类的实例。在Interface Builder中,通常用View Controller、Button和Label等指代控件区域中相应的模板,用viewController、button和label指代用这些模板生成的实例对象。本书中的OC指代Objective-C开发语言;crash指代程序运行出错。
本书使用的IDE为Xcode 8.0,使用的编程语言为Swift 3.0。在某些情况下,如果IB的使用在Swift和Objective-C上有不同,那么会将两者不同的用法都介绍一下。本书提到的源文件指Swift语言中的.swift文件,或者Objective-C语言中的.h、.m文件,例如Person类的源文件,就是指Person.swift文件,或者Person.h、Person.m文件。
你好作者,请教一个问题,控件与控件间的间距随屏幕比例动态变化使用xib本身可以实现吗?
利用unwind Segue回传的时候,因为swift中,是默认属性都是Pulic的,所以可以传出属性。在OC中,如果属性是在.m文件中,能否进行回传?还是必须写在.h文件中的才能回传