我想确定一个字符串的书写方向,这样我就可以在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友好的.
解决方法
问题中的代码虽然功能上很残酷.通过分析器运行它,当在图层的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可以检测到的唯一的从右到左语言,并且还应该涵盖波斯语,乌尔都语和意第绪语,尽管我还没有测试过.