用MyLayout实现布局性能的提升以及对国际化布局的支持

iOS界面布局库MyLayoutTangramKit已经完成新版本的升级并且已经更新到github和cocoapod上面。这次新版本更新的两个大亮点是对界面布局的性能进行了大幅度的提升和对阿拉伯国家需要进行RTL方向布局的支持

性能的提升。

多说无益,图表最具说服力

下面的图表是在iPhone6真机设备上用MyLayout和frame以及AutoLayout进行构建和布局的时间对比表格,里面的数据是每个视图的构建时间和布局时间,单位都是毫秒:

视图的构建和布局时间

构建时间 Frame MyLayout AutoLayout Masonry UIStackView
TGLinearLayout 0.08 0.164 0.219 0.304 0.131
TGFrameLayout 0.05 0.149 0.209 0.273 0.131
TGRelativeLayout 0.079 0.182 0.116 0.359 0.131
TGFlowLayout 0.08 0.107 0.198 0.258 0.131
TGFloatLayout 0.044 0.148 0.203 0.250 0.131
布局时间 Frame MyLayout AutoLayout Masonry UIStackView
TGLinearLayout 0 0.049 0.269 0.269 0.272
TGFrameLayout 0 0.042 0.243 0.243 0.272
TGRelativeLayout 0 0.068 0.274 0.274 0.272
TGFlowLayout 0 0.036 0.279 0.279 0.272
TGFloatLayout 0 0.055 0.208 0.208 0.272

下面的表格则是新老版本的性能提升对比图:

构建时间 1.3.6 1.3.5 提升% 布局时间 1.3.6 1.3.5 提升%
MyLinearLayout 0.164 0.211 28% 0.049 0.160 226%
MyFrameLayout 0.149 0.212 42% 0.042 0.142 234%
MyRelativeLayout 0.182 0.215 18% 0.068 0.137 101%
MyFlowLayout 0.107 0.146 37% 0.036 0.111 210%
MyFloatLayout 0.148 0.147 -0.48% 0.055 0.117 113%

从上面的表格中我们得出如下结论:

  1. 用frame构建视图用时最少,平均每个视图花费0.068ms。当视图的frame指定后就不再需要布局视图了,所以布局时间几乎是0。

  2. 当用AutoLayout进行布局时每个子视图的平均构建时长约为0.189ms,而Masonry因为是对AutoLayout的封装所以平均构建时长约为0.289ms。在布局时则因为都是使用了AutoLayout所以是相等的,大概花费0.255ms左右。

  3. MyLayout的实现因为是对frame的封装,所以无论是构建时长和布局时长都要优于AutoLayout,但低于原始的frame方法。MyLayout的平均构建时长约0.150ms,比frame构建要多花费2.2倍的时间;而AutoLayout的平均构建时长是MyLayout的1.26倍;Masonry的平均构建时长则是MyLayout的1.9倍。

  4. MyLayout的平均布局时长是0.05ms, 而AutoLayout的布局时长则是MyLayout的5倍。

  5. UIStackView的构建时长要稍微优于MyLayout的线性布局MyLinearLayout.但是布局时长则是MyLinearLayout的5.5倍。

  6. MyLayout中流式布局MyFlowLayout的构建时长和布局时长最小,而相对布局的构建和布局时长最长。

  7. 可以看出随着视图数量的增加Frame和MyLayout的时长都是按线性增长的,而AutoLayout的是越来越趋向非线性增长了。

  8. 如果我们使用SB或者XIB进行布局时那么整个布局的时长还要包括对XML格式文件的解析的时间因此,虽然SB或者XIB进行布局方便但是消耗的时间是最多的。

RTL的支持。

所谓RTL方向布局就是right to left direction。也就是界面中的元素总是按从右往左的方向进行排列布局,大部分国家的书写以及排列习惯都是从左往右,是LTR方向布局,而对于一些阿拉伯国家,文字的书写以及展示的顺序都是从右往左方向的,下面的两张图片展示了阿拉伯国家的界面展示效果。

RTL布局

RTL布局
苹果在iOS9中对RTL进行了全面的支持。而MyLayoutTangramKit这次新升级的版本对RTL的支持可是没有任何版本限制的。为了实现对RTL的支持我们在水平方向提出了leading和trailing的概念,中文就是理解为头部和尾部。当您是LTR方向布局时leading就是代表的左边而trailing则是代表的右边;而当您是RTL方向布局时leading就代表的是右边而trailing则代表的是左边。通过这个新定义的概念您就不需要担心在进行国际化布局时指定方向了。下面是MyLayout中对RTL支持的一些效果。

MyLayout对RTL的支持

为了实现RTL的支持您只需要将MyLayout的一个全局属性isRTL设置为YES或者NO就行了,通过这个属性可以很方便的切换布局的方向了。

最后欢迎大家关注我的iOS界面布局库:
MyLayout: https://github.com/youngsoft/...
TangramKit: https://github.com/youngsoft/...


坚持原创,以造轮子为乐

39 声望
1 粉丝
0 条评论
推荐阅读
swift 学习第一节课
第一步 打开xcodecreat workspace 创建一个工作空间第二步 create project 创建一个项目 {代码...} 使用commad + R运行 也可以用下面图片的三角符号输出

风口的猪会飞阅读 1k

一种将函数模板定义和声明分开的方法
  在 C++ 中为了操作简洁引入了函数模板。所谓的函数模板实际上是建立一个通用函数,其函数类型或形参类型不具体指定,用一个虚拟的类型来表达,这个通用函数就称为函数模板。

Sharemaker阅读 998

封面图
提高 Xcode 编译速度方法大总结
在最新版本的 Xcode 中,编译后查看 Report Navigator 面板,点击刚刚的那次编译,即可查看到整个编译流程,以及每一步的耗时。右键点击任意一个步骤,选择 Show In Timeline 可打开一个时间线面板,在实现面板中...

SwiftFun阅读 838

全面掌握 Swift 包依赖管理工具 —— 命令行、Manifest API、Xcode、二进制包、集合、插件
Swift 包管理工具,即 Swift Manager Package,简称 SwiftPM,是 Swift 开源项目的一部分,提供了包依赖管理的功能。相对于 CocoaPods、Carthage 等第三方管理工具,SwiftPM 是苹果自己研发,并和苹果平台和 Xcod...

SwiftFun阅读 738

swift 第二节课学习笔记 字符串连接
{代码...} 输出结果HelloWorld,asdhjdh,200请按任意键继续. . .

风口的猪会飞阅读 684

重载的奥义之函数重载
  重载,顾名思义从字面上理解就是重复装载,打一个不恰当的比方,你可以用一个篮子装蔬菜,也可以装水果或者其它,使用的是同一个篮子,但是可以用篮子重复装载的东西不一样。

Sharemaker阅读 419

封面图
Y 分钟速成 swift
Swift 是 Apple 开发的用于 iOS 和 macOS 开发的编程语言。Swift 于2014年 Apple WWDC (全球开发者大会)中被引入,用以与 Objective-C 共存,同时对错误代码更具弹性。Swift 由 Xcode 6 beta 中包含的 LLVM 编...

小X学技术1阅读 402

坚持原创,以造轮子为乐

39 声望
1 粉丝
宣传栏