背景

公司项目需支持多种语言,其中包含阿拉伯语,而阿拉伯语适配是一个比较麻烦的事情,不止在于它的文案的适配,更多的是在于其语言习惯的变化。可以使用手机切换为阿拉伯语,看到手机界面整个都反向显示了,由从左到右的布局习惯变成了从右到左的布局习惯

针对ios9之后的RTL(RightToLeft简称RTL)适配,苹果有一个官方文档教你怎么适配

定制RTL

当系统语言切换成RTL语言(阿拉伯语)后,如果App支持这个语言,系统会自动帮助App设置成RTL布局。但很多时候,我们希望自己配置当前是否是RTL,比如App内部支持切换App语言,App语言不一定跟系统语言保持一致,这时候,系统也是是英文,App内部设置了阿拉伯语,这时候我们依然要变成RTL布局,系统是不会帮我们完成这项任务的,我们只有自己来设置RTL。

ios9之后系统提供了相应的APi帮助我们完成定制。

android阿拉伯语布局 设置的阿拉伯语_App


1、视图布局

全局布局方式:当切换语言后,检测到是阿拉伯语时,修改为RTL,否则需切换回LTR

UIView设置semanticContentAttribute为RightToLeft

UISearchBar设置semanticContentAttribute为RightToLeft

UINavigationBar设置semanticContentAttribute为RightToLeft

android阿拉伯语布局 设置的阿拉伯语_ios_02

自动布局:如果使用Autolayout布局,需要使用leading和trailing布局,不能使用left和right,因为使用left和right,系统不会帮助我们调整布局

frame布局:对于frame布局,系统就没那么友好了,需要我们自己去探究RTL布局,实际上frame布局,只是调整了frame.origin.x的值,y和size是不会变的,所以,如果知道父视图的width,可以直接算出shituRTL下的frame的,所以可以对UIView写一个category,并且主动调用,去更新视图

android阿拉伯语布局 设置的阿拉伯语_新视图_03


2、手势(原本左滑返回,需变成右滑返回)

我们需要设置navigationBar和UINavigationController.view的semanticContentAttribute,为了让所有的UINavigationController生效,我们hook了UINavigationController的initWithNibName:bundle:

android阿拉伯语布局 设置的阿拉伯语_App_04


3、图片镜像(带方向性的图片,其他图片无需镜像)

给UIImage写一个扩展,使图片镜像显示

android阿拉伯语布局 设置的阿拉伯语_App_05


4、TextAlignment

以UILabel为例,我们hook它的setter的方法,根据当前是否是RTL,来设置正确的textAlignment,如果UILabel从未调用setTextAlignment:,我们还需要给它一个正确的默认值。

android阿拉伯语布局 设置的阿拉伯语_android阿拉伯语布局_06