阿拉伯语:

背景:阿拉伯语使用者占世界人口的6%,使用阿拉伯字母,为从右至左书写的文字,主要通行于18个阿拉伯国家及4个国际组织的官方语言。以阿拉伯语作为母语的人数超过2.6亿人。阿拉伯语在全球范围使用者总计目前已经突破4.4亿人。

语言特点:是由28个辅音字母和12个发音符号(不包括叠音符)组成的拼音文字。书写顺序从右往左横行书写,翻阅顺序也是由右往左。

左右的相互调换,使用系统提供的方法(RTL仅支持iOS9以上)

1.针对全部的UIView 使用镜像功能

[UIView appearance].semanticContentAttribute = UISemanticContentAttributeForceRightToLeft;
[UISearchBar appearance].semanticContentAttribute = UISemanticContentAttributeForceRightToLeft;
[[UINavigationBar appearance] setSemanticContentAttribute:UISemanticContentAttributeForceRightToLeft];

2.针对具体部分View使用

self.view.semanticContentAttribute = UISemanticContentAttributeForceRightToLeft;

3.针对xib、storyboard

Semantic 设置为spatial

前提: 使用 left right 或者 frame的情况下都是指定了具体的方向和坐标位置,系统不会进行调整,使用Leading和Trailing系统会自动调整。

判断当前方向:

[UIApplication sharedApplication].userInterfaceLayoutDirection[UIView userInterfaceLayoutDirectionForSemanticContentAttribute:view.semanticContentAttribute]view.effectiveUserInterfaceLayoutDirection

特殊控件:

1.collectionView

解决方案:修改CollectionViewFlowLayout

flipsHorizontallyInOppositeLayoutDirection是指开启 一个布尔值,指示水平坐标系是否在适当的时间自动翻转。 这个属性是默认关闭的 如果发生无法反转的话,我们需要这样打开。

flipsHorizontallyInOppositeLayoutDirection是readonly的,我们需要自定义layout,并重写getter方法。

2.tableView

header和cell不会改变textAlignment

文字

1.UIEdgeInsets

然而系统却不会自动帮我们将left和right调换。我们需要手动去适配它。

​ 方法一:在需要的地方判断以下。

​ 方法二:hook

2.TextAlignment(包括AttributeString的textAlignment)

​ 方法一:

[[(NSMutableParagraphStyle *)paraStyle setAlignment:NSNaturalTextAlignment];

​ 方法二:hook

3.双向文字

拉丁语和数字是始终LTR的,开发者需要自己适配。

​ 情景一:固定文字,如Label。(demo)

​ 我们的解决方式跟苹果推荐的一致,多语言拼接其他LTR字符。

​ 情景二:文字输入,如TextField

WWDC 2013 Making Your App World-Ready: International Text > Bidirectional Text

setBaseWritingDirection:forRange:
UITextWritingDirectionNatural

苹果不建议修改。

交互

1.滑动返回:

navigation需要单独设置,解决方案是hook了UINavigationController的initWithNibName:bundle:,单独设置UINavigationController的view的semanticContentAttribute

2.UISwipeGestureRecognizer:

hook了UISwipeGestureRecognizer的setDirection:

图片

系统不会为我们自动做处理,大部分图片也不需要处理,只需要手动旋转一下类似箭头的图片即可。

​ 方法一:系统提供了- (UIImage *)imageFlippedForRightToLeftLayoutDirection NS_AVAILABLE_IOS(9_0);

只有系统语言切换有用,应用内切换不生效,所以自己单独写方法

​ 方法二:修改xcassets中对应图片资源的direction

​ 方法三:使用Localize Resources

​ 方法四:

- (NSImage *)flipImage:(NSImage *)image
{NSImage *existingImage = image;NSSize existingSize = [existingImage size];NSSize newSize = NSMakeSize(existingSize.width, existingSize.height);NSImage *flippedImage = [[[NSImage alloc] initWithSize:newSize] autorelease];[flippedImage lockFocus];[[NSGraphicsContext currentContext] setImageInterpolation:NSImageInterpolationHigh];NSAffineTransform *transform = [NSAffineTransform transform];[transform translateXBy:existingSize.width yBy:0];[transform scaleXBy:-1 yBy:1];[transform concat];[existingImage drawAtPoint:NSZeroPoint fromRect:NSMakeRect(0, 0, newSize.width, newSize.height) operation:NSCompositeSourceOver fraction:1.0];[flippedImage unlockFocus];return flippedImage;
}

哪些功能不需要适配RTL?

Types of controls and content that should not flip in a right-to-left language are:

  • Video controls and timeline indicators

  • Images, unless they communicate a sense of direction, such as arrows

  • Clocks

  • Music notes and sheet music(乐谱)

  • Graphs (x– and y–axes always appear in the same orientation)

toolbars RTL不生效,怎么办?

if ([NSApp userInterfaceLayoutDirection] == NSUserInterfaceLayoutDirectionRightToLeft) {NSArray *toolbarItems = [[self.toolbar items] copy];for (NSToolbarItem *item in toolbarItems) {[self.toolbar removeItemAtIndex:toolbarItems.count-1];[self.toolbar insertItemWithItemIdentifier:item.itemIdentifier atIndex:0];}
}

要点总结

1.尽量都使用约束来做UI,且不要用left和right,改用leading和trailing。

2.文字对齐如果是左右对齐的话,都使用NSNaturalTextAlignment。

3.多语言遇到拼接字符串的话,要谨慎。其他LTR语言中,如果是拼接字符串,第一个字符是RTL语言,会出现显示问题,应该使用localizedStringWithFormat(使用后,底层会去判断去除该字符之后的字符串的第一个字符)。

4.如果遇到需要适配排列方向的collectionView,提前自定义layout。

5.需要镜像的图片使用恰当的方法实现。

参考资料

RLT官方文档
WWDC2015
WWDC2016

iOS 阿拉伯语 RTL适配相关推荐

  1. Android阿拉伯语UI适配问题汇总

    Android阿拉伯语UI适配问题汇总 Sensi Sun RTL和LTR LTR 是 Left-to-right(从左向右) 的缩写.(常用) RTL 是 Right-to-left(从右向左) 的 ...

  2. Unity阿拉伯语的适配(终极版)

    最近在做阿语的适配,发现网上并没有一套完整的方案,这次给大家带来一套完整的解决方案,并配上一套可扩展的代码,希望我们每个人以后再遇到阿拉伯语的适配的时候,可以使用这套终极解决方案来搞定.同时随着uni ...

  3. Android国际化,阿语RTL适配总结

    语言切换 语言种类 例如: /*** 英国(英语)*/EN("en"),/*** 西班牙(西班牙语)*/ES("es"),/*** 西班牙(葡萄牙语)*/PT( ...

  4. RTL适配-阿拉伯语

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

  5. Android 系统(226)---Android 阿拉伯语适配

    Android 阿拉伯语适配 RTL 语言由来 RTL 是 Right-to-left(从右向左) 的缩写.其意为人们书写阅读习惯是从右向左,朝左继续的,常见的 RTL 语言有阿拉伯语,希伯来语等. ...

  6. Android 阿拉伯语适配

    首先推荐一个链接:https://www.jianshu.com/p/d8cd294a5c31 开始进入正题 1.sdk要求: Android 4.2 即 SDK 17 2.四个重要属性: andro ...

  7. Unity3d实现阿拉伯语适配,不规则特殊字符的处理。

    前言 最近做了阿拉伯语的语言适配.记录一些比较麻烦的点.其实我也没太明白具体和其他语言有什么不同,唯一听懂的就是他们的语序是从右往左的(比如"你好!",他们的阅读顺序是" ...

  8. 安卓 阿拉伯语显示时文字的适配

    当手机设备的蓝牙名改为阿拉伯语或者维吾尔语时,该语言是RTL模式. 当DA侧连接到该设备时,会显示该设备的信息:[%1$s] is set as the priority device 此时默认位置会 ...

  9. Unity3d实现阿拉伯语适配,不规则特殊字符的处理

    前言 最近做了阿拉伯语的语言适配.记录一些比较麻烦的点.其实我也没太明白具体和其他语言有什么不同,唯一听懂的就是他们的语序是从右往左的(比如"你好!",他们的阅读顺序是" ...

最新文章

  1. python编程主要干嘛的-让孩子学了Python编程有什么用
  2. vue node --- 前后端联系的知识梳理
  3. 底层系统如何实现数据一致性/系统底层如何保证有序性
  4. IO流的体系及FileReader、FileWriter
  5. 浅谈HotSpot逃逸分析
  6. Mysql之数据库锁(表锁和行锁)详解
  7. ERROR streaming.StreamExecution:createConsumer(ConsumerStrategy.scala:63)
  8. 学python能做什么-学Python后到底能干什么?网友:我太难了
  9. android 入门 (分析: 非匿名内部类 监听功能的实现)
  10. console.log的问题
  11. 2021第三届长安杯检材一wp
  12. 【c】蔡勒公式计算日期
  13. Linux 复制文件报 not a regular file
  14. python dbf 修改_Python修改DBF文件指定列
  15. 北京54坐标与西安80坐标相互转换的两种方法
  16. 使用spilt截取文件名后缀时出现的问题
  17. 软件测试工程师面试的时候该怎么样介绍自己?你的简历是不是该优化了
  18. python3可视化-pyecharts图形库,大饼图Pie的创建和使用
  19. html中pre与xmp标签的区别是什么
  20. 常用CV数据集(持续更新中)

热门文章

  1. hbase 源代码分析 (17)MapReduce 过程
  2. mysql之数据库引擎
  3. 获取时间段内所有周次及其起讫日期
  4. OpenCV Java入门一 在MAC系统上安装OpenCV
  5. 计算机网络杨庚第一章答案,《计算机通信与网络》习题答案
  6. 史上最全讲解:Spring详解
  7. 机甲大师机器人控制(三):软件架构设计
  8. 5种顶级逻辑思维训练法:1min 轻松上手,工作学习都能用
  9. 为什么一个数的平方,会变负数?结果令人惊讶(sq代码解析)
  10. 当年做国际医学生实习的一点遗憾