背景
公司项目需支持多种语言,其中包含阿拉伯语,而阿拉伯语适配是一个比较麻烦的事情,不止在于它的文案的适配,更多的是在于其语言习惯的变化。可以使用手机切换为阿拉伯语,看到手机界面整个都反向显示了,由从左到右的布局习惯变成了从右到左的布局习惯
针对ios9之后的RTL(RightToLeft简称RTL)适配,苹果有一个官方文档教你怎么适配
定制RTL
当系统语言切换成RTL语言(阿拉伯语)后,如果App支持这个语言,系统会自动帮助App设置成RTL布局。但很多时候,我们希望自己配置当前是否是RTL,比如App内部支持切换App语言,App语言不一定跟系统语言保持一致,这时候,系统也是是英文,App内部设置了阿拉伯语,这时候我们依然要变成RTL布局,系统是不会帮我们完成这项任务的,我们只有自己来设置RTL。
ios9之后系统提供了相应的APi帮助我们完成定制。
1、视图布局
全局布局方式:当切换语言后,检测到是阿拉伯语时,修改为RTL,否则需切换回LTR
UIView设置semanticContentAttribute为RightToLeft
UISearchBar设置semanticContentAttribute为RightToLeft
UINavigationBar设置semanticContentAttribute为RightToLeft
自动布局:如果使用Autolayout布局,需要使用leading和trailing布局,不能使用left和right,因为使用left和right,系统不会帮助我们调整布局
frame布局:对于frame布局,系统就没那么友好了,需要我们自己去探究RTL布局,实际上frame布局,只是调整了frame.origin.x的值,y和size是不会变的,所以,如果知道父视图的width,可以直接算出shituRTL下的frame的,所以可以对UIView写一个category,并且主动调用,去更新视图
2、手势(原本左滑返回,需变成右滑返回)
我们需要设置navigationBar和UINavigationController.view的semanticContentAttribute,为了让所有的UINavigationController生效,我们hook了UINavigationController的initWithNibName:bundle:
3、图片镜像(带方向性的图片,其他图片无需镜像)
给UIImage写一个扩展,使图片镜像显示
4、TextAlignment
以UILabel为例,我们hook它的setter的方法,根据当前是否是RTL,来设置正确的textAlignment,如果UILabel从未调用setTextAlignment:,我们还需要给它一个正确的默认值。