一种发现文字书写方向的较轻方式

War*_*ton 6 text arabic ios

我想确定一个字符串的书写方向,这样我就可以在CALayer中正确地呈现从右到左的语言,例如阿拉伯语.

所以我有这个方法

+(UITextAlignment)alignmentForString:(NSString *)astring
{
    UITextView *text = [[UITextView alloc] initWithFrame:CGRectZero];
    text.text = astring;

    if ([text baseWritingDirectionForPosition:[text beginningOfDocument] inDirection:UITextStorageDirectionForward] == UITextWritingDirectionRightToLeft) {
        return UITextAlignmentRight;
    }

    return UITextAlignmentLeft;

}
Run Code Online (Sandbox Code Playgroud)

工作正常,但感觉有点沉重只是为了发现哪种方式来调整我的文本,特别是在drawInContext中调用它(尽管相对不频繁).

是否有一种较轻的方法来确定给定字符串的书写方向,或者我应该在过早优化的基础上坚持这一点.它必须是iOS 5友好的.

War*_*ton 14

问题中的代码虽然功能上很残酷.通过分析器运行它,您会发现它UITextView.setText在图形的drawInContext方法中使用时花费了近80%的时间.

大多数答案都在NSString的Detect Language中

因此,一个更好的形式......

+(UITextAlignment)alignmentForString:(NSString *)astring
{

    if (astring.length) {

        NSArray *rightLeftLanguages = @[@"ar",@"he"];

        NSString *lang = CFBridgingRelease(CFStringTokenizerCopyBestStringLanguage((CFStringRef)astring,CFRangeMake(0,[astring length])));

        if ([rightLeftLanguages containsObject:lang]) {

            return UITextAlignmentRight;

        }
    }

    return UITextAlignmentLeft;

}
Run Code Online (Sandbox Code Playgroud)

阿拉伯语和希伯来语是唯一可以检测到的,从CFStringTokenizerCopyBestStringLanguage而且也应该包括波斯语,乌尔都语和意第绪语的从右到左语言,尽管我还没有测试过.

另见http://en.wikipedia.org/wiki/Right-to-left

  • 我正在使用它来确定检测到的语言是否是RTL:`NSLocaleLanguageDirection direction = [NSLocale characterDirectionForLanguage:language]; return(direction == NSLocaleLanguageDirectionRightToLeft)?NSTextAlignmentRight:NSTextAlignmentLeft;` (2认同)