适配阿拉伯语会引发的问题:
- UIView的frame发生翻转
- 图片镜像问题
- UICollectionViewFlowLayout
- UITableView的header和cell 不会改变textAlignment
以上问题解决方案如下:
问题一:UIView的frame发生翻转
我们可以根据系统提供的方法,对全部的UIView使用镜像功能
[UIView appearance].semanticContentAttribute = UISemanticContentAttributeForceLeftToRight;
[UISearchBar appearance].semanticContentAttribute = UISemanticContentAttributeForceLeftToRight;
上述的代码可以帮助我们禁用镜像功能,如果想要开启镜像功能,只需要将UISemanticContentAttributeForceLeftToRight更改为UISemanticContentAttributeForceRightToLeft用masonry对view进行约束是,用trailing和leading 代替left和right,这样在切换到阿拉伯语是,系统会自动适应,这也解决了我们开发中的大部分UI问题.
问题二:图片镜像问题
- 在阿拉伯语的情形下 某些图片是需要镜像的。比如带箭头的返回按钮,正常的情况下,箭头是朝左的,在阿拉伯语情形下。箭头是朝右的。针对上述情况,系统提供了一个镜像方法
- (UIImage *)imageFlippedForRightToLeftLayoutDirection API_AVAILABLE(ios(9.0));
- 但是上述方法只适用于系统语言是阿拉伯语,如果app内部切换为阿拉伯语 是不生效的,于是有了下方代码
@implementation UIImage (ImageMirror)
+(UIImage *)cn_imageFlippedForRightToLeftLayoutDirection{
if (isRTL()) {
return [UIImage imageWithCGImage:self.CGImage scale:self.scale orientation:UIImageOrientationUpMirrored];
}
return self;
}
@end
对于需要在RTL下镜像的图片,手动对image调用cn_imageFlippedForRightToLeftLayoutDirection即可
在图片资源中更改图片属性
问题三:UICollectionViewFlowLayoutflipsHorizontallyInOppositeLayoutDirection是指开启 一个布尔值,指示水平坐标系是否在适当的时间自动翻转。 这个属性是默认关闭的 如果发生无法反转的话,我们需要这样打开。
由于flipsHorizontallyInOppositeLayoutDirection是只读的属性,因此需要我们自定义layout,并重写getter方法。
问题四:UILabel在阿拉伯语状态下依然是左对齐
- 在对UILabel设置居中方式的时候设置为NSTextAlignmentNatural 会根据不同语言,对齐方式不同。