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

时间:2013-04-29 22:10:51

标签: ios text arabic

我想确定一个字符串的书写方向,这样我就可以在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;

}

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

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

3 个答案:

答案 0 :(得分:14)

问题中的代码虽然功能性非常昂贵。通过分析器运行它,当在图层的drawInContext方法中使用时,您会发现它在UITextView.setText中花费了近80%的时间。

大部分答案都在Detect Language of NSString

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

+(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;

}

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

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

答案 1 :(得分:1)

由于不推荐使用UITextAlignment,这里是带有NSWritingDirection的NSString类别:

- (NSWritingDirection)alignment{
    if (self.length) {
        NSArray *rightLeftLanguages = @[@"ar",@"he"];
        NSString *lang = CFBridgingRelease(CFStringTokenizerCopyBestStringLanguage((CFStringRef)self,CFRangeMake(0,self.length)));
        if ([rightLeftLanguages containsObject:lang]) {
            return NSWritingDirectionRightToLeft;
        }
    }
    return NSWritingDirectionLeftToRight;

}

答案 2 :(得分:1)

夫特

对我来说,.natural的{​​{1}} textAlignment无效,除非我从头开始编辑文字和行。

基于the great answer to this questionthe comment below it

UITextView