iOS 阿拉伯语 RTL适配
阿拉伯语:
背景:阿拉伯语使用者占世界人口的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适配相关推荐
- Android阿拉伯语UI适配问题汇总
Android阿拉伯语UI适配问题汇总 Sensi Sun RTL和LTR LTR 是 Left-to-right(从左向右) 的缩写.(常用) RTL 是 Right-to-left(从右向左) 的 ...
- Unity阿拉伯语的适配(终极版)
最近在做阿语的适配,发现网上并没有一套完整的方案,这次给大家带来一套完整的解决方案,并配上一套可扩展的代码,希望我们每个人以后再遇到阿拉伯语的适配的时候,可以使用这套终极解决方案来搞定.同时随着uni ...
- Android国际化,阿语RTL适配总结
语言切换 语言种类 例如: /*** 英国(英语)*/EN("en"),/*** 西班牙(西班牙语)*/ES("es"),/*** 西班牙(葡萄牙语)*/PT( ...
- RTL适配-阿拉伯语
背景 公司项目需支持多种语言,其中包含阿拉伯语,而阿拉伯语适配是一个比较麻烦的事情,不止在于它的文案的适配,更多的是在于其语言习惯的变化.可以使用手机切换为阿拉伯语,看到手机界面整个都反向显示了,由从 ...
- Android 系统(226)---Android 阿拉伯语适配
Android 阿拉伯语适配 RTL 语言由来 RTL 是 Right-to-left(从右向左) 的缩写.其意为人们书写阅读习惯是从右向左,朝左继续的,常见的 RTL 语言有阿拉伯语,希伯来语等. ...
- Android 阿拉伯语适配
首先推荐一个链接:https://www.jianshu.com/p/d8cd294a5c31 开始进入正题 1.sdk要求: Android 4.2 即 SDK 17 2.四个重要属性: andro ...
- Unity3d实现阿拉伯语适配,不规则特殊字符的处理。
前言 最近做了阿拉伯语的语言适配.记录一些比较麻烦的点.其实我也没太明白具体和其他语言有什么不同,唯一听懂的就是他们的语序是从右往左的(比如"你好!",他们的阅读顺序是" ...
- 安卓 阿拉伯语显示时文字的适配
当手机设备的蓝牙名改为阿拉伯语或者维吾尔语时,该语言是RTL模式. 当DA侧连接到该设备时,会显示该设备的信息:[%1$s] is set as the priority device 此时默认位置会 ...
- Unity3d实现阿拉伯语适配,不规则特殊字符的处理
前言 最近做了阿拉伯语的语言适配.记录一些比较麻烦的点.其实我也没太明白具体和其他语言有什么不同,唯一听懂的就是他们的语序是从右往左的(比如"你好!",他们的阅读顺序是" ...
最新文章
- python编程主要干嘛的-让孩子学了Python编程有什么用
- vue node --- 前后端联系的知识梳理
- 底层系统如何实现数据一致性/系统底层如何保证有序性
- IO流的体系及FileReader、FileWriter
- 浅谈HotSpot逃逸分析
- Mysql之数据库锁(表锁和行锁)详解
- ERROR streaming.StreamExecution:createConsumer(ConsumerStrategy.scala:63)
- 学python能做什么-学Python后到底能干什么?网友:我太难了
- android 入门 (分析: 非匿名内部类 监听功能的实现)
- console.log的问题
- 2021第三届长安杯检材一wp
- 【c】蔡勒公式计算日期
- Linux 复制文件报 not a regular file
- python dbf 修改_Python修改DBF文件指定列
- 北京54坐标与西安80坐标相互转换的两种方法
- 使用spilt截取文件名后缀时出现的问题
- 软件测试工程师面试的时候该怎么样介绍自己?你的简历是不是该优化了
- python3可视化-pyecharts图形库,大饼图Pie的创建和使用
- html中pre与xmp标签的区别是什么
- 常用CV数据集(持续更新中)