NSMutableParagraphStyle忽略了NSWritingDirectionNatural,默认为LTR为阿拉伯语文本

时间:2014-05-22 15:13:49

标签: uikit nsattributedstring right-to-left

我正在使用NSAttributedString UIKit Additions在UIView中绘制属性字符串。我遇到的问题是,尽管我的段落样式的NSWritingDirectionNatural属性使用baseWritingDirection值,但文本始终默认为从左到右。

以下是我如何形成属性字符串(简化):

NSString *arabic = @"العاصمة الليبية لتأمينها تنفيذا لقرار المؤتمر الوطني العام. يأتي ذلك بعدما أعلن اللواء الليبي المتقاعد خليفة حفتر أنه طلب من المجلس الأعلى للقض الدولة حتى الانتخابات النيابية القادمة";

NSMutableParagraphStyle *paragraph = [[NSMutableParagraphStyle alloc] init];
paragraph.baseWritingDirection = NSWritingDirectionNatural;
paragraph.lineBreakMode = NSLineBreakByWordWrapping;

NSMutableDictionary *attributes = [[NSMutableDictionary alloc] init];
attributes[NSParagraphStyleAttributeName] = paragraph;

NSAttributedString *string = [[NSAttributedString alloc] 
                             initWithString:arabic 
                             attributes:attributes];

以下是我绘制文字的方式:

- (void)drawRect:(CGRect)rect {
    [self.attributedText drawWithRect:rect 
                              options:NSStringDrawingUsesLineFragmentOrigin 
                              context:nil];
}

然而它仍然从左向右流动:

screenshot

我错过了什么?

3 个答案:

答案 0 :(得分:6)

我不相信除非您在设备上切换语言,否则将使用baseWritingDirection自动为您设置书写方向:

“如果指定了NSWritingDirectionNaturalDirection,则接收方将写入方向解析为NSWritingDirectionLeftToRight或NSWritingDirectionRightToLeft,具体取决于用户语言首选项设置的方向。”

出于某种原因,如果没有将语言添加到支持的本地化版本,即使选择了阿拉伯语,您仍然无法使用该文本。这个角色似乎没有为我做这件事:كتب

此外,它在硬编码的阿拉伯字符串中看起来像Xcode reverses the characters,因此可能会搞砸一些复制和粘贴。

您可以使用agiletortoisessuggestionNSLinguisticTagger's Language tag scheme手动设置语言。

答案 1 :(得分:4)

我无法解释为什么它不会像你编写的那样工作,但我一直在使用一种解决方案来明确地设置基于已知RTL语言的方向,并以此为出发点:

https://stackoverflow.com/a/16309559

答案 2 :(得分:0)

不知道这是否相关,但是当我在自动布局中测试从右到左的支持时,在我为该语言添加本地化(阿拉伯语,希伯来语等)之前它没有工作应用程序。