在 iOS 上面开发界面,需要创建视图、配置界面、视图分层等等很多步骤,也就不可避免的需要书写 N 多的代码。这还仅仅是界面设计,除此之外,完成 controllers 的回调、控制内部事务在界面上的显示效果、界面的操控和内部事务的联系等等多方面的事情都需要手动解决。即便是界面很简单的 App,如果存在这种复杂的双向数据流的关系,那么代码也会变得很复杂很容易出错。Qt 的信号、槽和 iOS 的 Target-Action 机制其实也是很容易实现这种双向数据流的关系,但是没有办法解决界面和事务之间的联系,也有很多其他的问题:性能、测试等。

这些问题曾经困扰了我们多年。News Feed 是有着复杂的列表样式外观的 iOS 软件,由许多的 Row Type 组成,每一个 Row 都有各种各样不同的很烦的界面样式和交互方式,这个就很坑了。每次维护这个东西都像是在清理厕所,尤其是它的功能还在不断增加,它的代码在不断变多,版本迭代速度快到你都没办法直到每天都到底增添了什么新代码,上司还要拿着报告说“你这个软件太慢了,影响用户体验,给你三个小时把这个 App 的速度提高 80%”。

为了解决这一挑战性的问题,我们从自己的 ReactJS 得到启发,把很多具体的东西抽象出来,做出一个功能性的、响应式编程模型的 iOS 原生 UI 框架 ComponentKit,目前 News Feed 在应用这个框架。

ComponentKit 简介

ComponentKit 使用功能性和声明性(declarative)的方法来进行创建界面,和以往不同的是,ComponentKit 使用单向数据流的形式从 不可变的模型 映射到不可变的组件来确定视图的显示方式。ComponentKit 的 declarative 看上去和 declarative UI(QML) 差不多,其实差得远。QML 更偏向于 UI 设计的描述性,而 ComponentKit 则是做好基本 UI 和事件之间的联系,让事件设计和 UI 设计可以分开单独完成。

内在决定外在,组件的功能和内部的层次决定了用户界面该如何规划,界面的规划决定了 UI Kit 的元素层次结构的设计。

传统做法的结果是大部分时间都被浪费在 UI 该如何实现,ComponentKit 却可以让你把时间都用在在 UI 该怎么设计上面。

例如,传统的 iOS 开发中,为了开发一个带有 header、text 和 footer 的视图,需要以下步骤:

  1. 分别创建 header 视图、text 视、footer 视图的实例
  2. 将三个视图添加为 container 的子视图
  3. 添加约束条件,让每个视图和 container 的宽度相同
  4. 添加更多的约束条件,确保每个视图的摆放位置

但是 ComponentKit 不一样,ComponentKit 是一种描述性的开发包:你只需要提供你希望得到什么便能得到什么,而不和传统的 iOS 开发一样,再去一个一个地创建视图、修改视图样式、添加视图、添加约束条件。如图所示,想要得到这个布局,只需要使用描述性的语言描述“我想要一个 header 组件,一个 text 组件,一个 footer 组件,他们的宽度相同,从上到下排列在一起”。单单从这点来看,和 QML 相比,ComponentKit 更类似于 Bootstrap:提供已经完成的组件,你只需要决定组件如何摆放,便可轻松地开发出 UI 界面。

ComponentKit 已经完全把如何渲染 UI 的事情抽象出来,程序员完全可以不去考虑具体是如何实现渲染的,也不用去考虑界面渲染该如何优化。ComponentKit 使用后台线程进行界面布局,也实现了智能组件重用,你完全可以不去考虑界面导致的内存泄露问题。ComponentKit 不仅仅可以极大地提高开发效率,界面响应速度和软件的运行效率也会有极大地提升。

News Feed 移植到 ComponentKit

ComponentKit 极大地提升了 News Feed 的 UI 响应速度和稳定性,也让整个软件的内部编码更容易理解。ComponentKit 达到了如下的目标:

  1. 减少了 70% 的界面渲染代码,麻麻再也不用担心我每次去维护之前都要看那本又臭又长的手册然后花一上午的时间去理解那个错综复杂的布局了。
  2. 显著地提高了滑屏的性能。ComponentKit 消除了许多的 container视图,尽力将所有的视图结构化简。更简洁的视图结构意味着界面的渲染性能和执行效率更高。
  3. 提高测试覆盖率。ComponentKit 对于 UI 模块化的设计保证了每一部分都可以被分离开来单独进行测试。再加上 snapshot tests,我们现在几乎已经可以对 News Feed 的所有部分都进行测试了。

引入了 ComponentKit 之后,我们能够维护更少的代码,有更少的 bug 需要修复,有更大的测试覆盖率:我们现在可以有更多的时间做羞羞的事情了

ComponentKit 已经在生产环境的 News Feed 上用了六个月,我们觉得可以一直用下去。现在将 ComponentKit 开源,让整个 iOS 开发者社区的人都有 Facebook 的生产效率,也都能和 Facebook 一样做出高性能的 App。很希望你也能在你的开发环境中使用 ComponentKit,然后给我们反馈。

我们重新定义了如何在 iOS 上开发界面,希望你也能用 ComponentKit 开发出更优雅的 App。

快速入门

ComponentKit 已经在 CocoaPods 中可用了,只需要在 Podfile 添加如下代码即可:

pod 'ComponentKit', '~> 0.9'
pod try ComponentKit

关于Facebook iOS UI 工具ComponentKit简介相关推荐

  1. ios逆向工具MonkeyDev简介

    MonkeyDev简介 虽然是美国的苹果开发的操作系统,但是要论越狱iPhone和逆向分析来说,那国内远胜于米国了,可能是国内很多相关的灰色产业链吧.在之前,我们想动态调试一个没有源码的应用程序,通常 ...

  2. iOS开发UI篇—CALayer简介

    iOS开发UI篇-CALayer简介 一.简单介绍 在iOS中,你能看得见摸得着的东西基本上都是UIView,比如一个按钮.一个文本标签.一个文本输入框.一个图标等等,这些都是UIView. 其实UI ...

  3. iOS GitHub Top 100 简介

    GitHub Top 100 简介 主要对当前 GitHub 排名前 100 的项目做一个简单的简介, 方便初学者快速了解到当前 Objective-C 在 GitHub 的情况. Android 版 ...

  4. 基于 KIF 的 iOS UI 自动化测试和持续集成

    客户端 UI 自动化测试是大多数测试团队的研究重点,本文介绍猫眼测试团队在猫眼 iOS 客户端实践的基于 KIF 的 UI 自动化测试和持续集成过程. 一.测试框架的选择 iOS UI 自动化测试框架 ...

  5. 跨平台iOS自动化测试工具——tidevice

    前言 一直以来,iOS自动化的实现&执行都依赖 Mac 系统,其主要原因是因为需要通过 Xcodebuild 编译&安装 WDA (WebDriverAgent) 到 iOS 设备中, ...

  6. 那些好用的iOS开发工具

    版权说明 本文首发于<程序员>杂志2014年6月刊,未经允许,请勿转载. 前言 从苹果发明iPhone起,AppStore上的一个又一个类似flappy bird的一夜暴富的故事刺激着大量 ...

  7. 好用的iOS开发工具

    前言 从苹果发明 iPhone 起,AppStore 上的一个又一个类似 flappy bird 的一夜暴富的故事刺激着大量开发者加入移动开发大军.随着这些开发者出现的,还有大量方便 iOS 开发者的 ...

  8. iOS开发工具——网络封包分析工具Charles

    iOS开发工具--网络封包分析工具Charles 简介 Charles是在Mac下常用的截取网络封包的工具,在做iOS开发时,我们为了调试与服务器端的网络通讯协议,常常需要截取网络封包来分析.Char ...

  9. 直接拿来用!10款实用Android UI工具

    转载地址:http://blog.csdn.net/bboyfeiyu/article/details/13295233 移动应用的UI设计就好似达摩克利斯之剑,一方面,一个视觉.交互.体验良好的UI ...

最新文章

  1. WindowType 属性
  2. ORACLE的ASM
  3. Linux IPC POSIX 消息队列
  4. 网易有道2017内推编程题
  5. SSD硬盘 全盘安全擦除
  6. VMware和NVIDIA推出新一代混合云架构
  7. c# Aspose.Words插入饼图PieChart
  8. servlet实现mvc
  9. 设计模式一(抽象工厂模式)
  10. Focal Loss for Dense Object Detection解读
  11. oracle 求班级平均分
  12. iPhone界面学习(2)
  13. 联想小新触摸板驱动_联想lenovo笔记本触摸板驱动-联想触摸驱动 win7版下载16.2.5.0 官方版-西西软件下载...
  14. ESP8285如何做探针盒子
  15. html 阴历阳历转换,本人花了一个星期的时间,使用ASP代码获得公历并转换成农历时间(2021年至2100年)...
  16. Layman数字土地指南
  17. 局域网游戏联机大厅建主模式实现附(Unity)
  18. 分享三个网页访问(点击)统计脚本,展示访问来源地图分布
  19. folly库安装(3)libevent、libunwind的安装
  20. python万年历源代码,python万年历实现代码 含运行结果

热门文章

  1. 库克:苹果收取 30% 佣金很合理!
  2. 微隔离的红蔷薇在湾区创见的舞台绽放
  3. Qt编写网络调试助手(TCP客户端+TCP服务端+UDP服务端)终极版开源
  4. vue-cli3.0 移动端适配
  5. bitcoin转账api,python3.7
  6. Btree(B-树)---C++
  7. ehcache + spring 整合以及配置说明 ,附带整合问题 (已解决)
  8. 数据库中INFORMATION_SCHEMA的说明及使用
  9. 光热发电未来或成长为南非电力供应市场的主力军
  10. iOS开发系列--C语言之存储方式和作用域