7

我想确定字符串的书写方向,以便可以在 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 友好。

4

3 回答 3

15

问题中的代码虽然功能强大,但非常昂贵。通过分析器运行它,您会发现它在UITextView.setText用于图层的 drawInContext 方法时花费了接近 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

于 2013-04-30T21:51:27.490 回答
3

迅速

对我来说,除非我从头开始编辑文本和行,否则.natural textAlignmentof不起作用。UITextView

基于对这个问题的很好的回答下面的评论

let text = "..."
let lang = CFStringTokenizerCopyBestStringLanguage(text as CFString, CFRange(location: 0, length: text.characters.count))

if let lang = lang {
    let direction = NSLocale.characterDirection(forLanguage: lang as String)

    if direction == .rightToLeft {
        textView.textAlignment = .right
    }
    else {
        textView.textAlignment = .left
    }
}
于 2017-10-25T13:14:41.590 回答
2

由于 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;

}

于 2016-01-06T08:01:42.253 回答