我想确定一个字符串的书写方向,这样我就可以在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友好的。
答案 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
检测到的从右到左的语言,并且还应该包括波斯语,乌尔都语和意第绪语,尽管我还没有测试过。
答案 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 question和the comment below it。
UITextView