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

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

问题中的代码虽然function性很大,但却非常昂贵。 通过分析器运行它,当在图层的drawInContext方法中使用时,您会发现它在UITextView.setText占用的时间接近80%。

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

因此,一个更好的forms……

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

由于不推荐使用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; 

}

迅速

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

基于这个问题的优秀答案和下面的评论 。

 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 } }