前言
Telegram 项目中使用基于 Facebook 开源的 AsyncDisplayKit
(以下简称 ASDK,目前已经停止维护,并于 2017 年迁移到新库,更名为 Texture ) + 部分自己基于 ASDK 定制的 Display
构建大部分UI;
根据 BUILD
文件,我们能清楚知道这两个包的结构,以及依赖关系;(不懂 BUILD
文件是啥?看这:基于Telegram二次开发 --- Bazel初探)
1. AsyncDisplayKit 简介
ASDK(现名 Texture)是 FaceBook 开源的一款能够保持界面流畅的框架。建立在 UIKit 之上,可以保持最复杂的用户界面的流畅和响应;
ASDK 的作者是 Scott Goodson (Linkedin),他曾经在苹果工作,负责 iOS 的一些内置应用的开发,比如股票、计算器、地图、钟表、设置以及 Safari 等,当然他也参与了 UIKit framework 的开发。后来他加入 Facebook 后,负责 Paper 的开发,创建并开源了 AsyncDisplayKit;
2. AsyncDisplayKit 学习曲线
-
AsyncDisplayKit 2.0 教程:入门「译」
原文是官方发布的新手教程(当然,默认了你是 iOS 开发者); -
Texture的异步渲染和布局引擎
详细说明了 Texture 的设计原理、架构以及在 iOS 端显得新颖的 FlexBox 布局; -
iOS 上的 FlexBox 布局
对于 FlexBox 布局系统性的分析; -
iOS 开发一定要尝试的 Texture(ASDK)
Texture 进阶; -
Why I build my apps using Texture (and why you should too)
实战项目分析 <为什么我使用 Texture 构建我的应用程序(以及为什么你也应该这样做)>;
3. Telegram 与AsyncDisplayKit
Telegram 并没有将 AsyncDisplayKit 全盘接入,而是作为子模块接入,Telegram 剔除了很大一部分 AsyncDisplayKit 内容,根据自己需求最低限度的保留了核心 node
,然后自己重写了几百个 node
的子类,这些类散落在如 Display、TelegramUI、ItemListUI 以及支持 Telegram UI 主要功能的其他子模块中。
如图所示:
- 蓝色框:保留下来的代码。
- 虚线框:已经删除或保留名字但内部实现已经被重写或以及某些只是为了方便将框架迁移进来却没有在项目中使用。
Telegram 保留了约 35% 的 AsyncDisplayKit
代码:
- 基础 Nodes 比如ASDisplayNode、ASControlNode、ASEditableTextNode 和 ASScrollNode 大多保持原状。
-
ASImageNode 以及其子类被移除;
Telegram 使用 MTProto 而非HTTPS 从链接加载图片,官方版本里面的 网络图片的支持 没有用,因此依赖库 PINRemoteImage 也被删除;
保留了ASImageNode
类名,用 swift 自定义。 - 所有官方的 node containers 被移除,比如 ASCollectionNode、ASTableNode、ASViewController 等;
Tables
和view controllers
使用 Swift 重新实现并且移除了对 IGListKit 库的依赖。 - Telegram 更喜欢手动布局;所以 CSS Flexbox 样式的 官方布局API 被弃用,yoga engine 被删除。
- 内部 日志记录和调试功能 已删除。