gpt4 book ai didi

objective-c - UITextView 中的 RTL 和 LTR(双向)

转载 作者:搜寻专家 更新时间:2023-10-30 20:25:45 28 4
gpt4 key购买 nike

我正在尝试保存 UITextView 的内容,其中包含同时采用 RTL 和 LTR 格式的文本行。问题是 UITextView 只检查格式化方向的第一个字符。假设我处于“编辑”模式并编写此文本(__ 表示空格):

text1_______________________________________
____________________________________________אקסא
text2_______________________________________

保存后我们失去了 אקסא 的 RTL。现在我想再次编辑这段文字,现在看起来像这样:

text1_______________________________________
אקסא
text2_______________________________________

我无法在一个 UITextView 中混合使用\u200F 和\u200E 方向字符。如何管理它并从 UITextView 正确保存双向文本?

最佳答案

这是一个使用 NSAttributedString 的快速概念证明:
- 将文本拆分成段落
- 对于每个段落,检测主要语言
- 为相应范围创建具有正确对齐方式的属性文本

// In a subclass of `UITextView`

+ (UITextAlignment)alignmentForString:(NSString *)astring {
NSArray *rightToLeftLanguages = @[@"ar",@"fa",@"he",@"ur",@"ps",@"sd",@"arc",@"bcc",@"bqi",@"ckb",@"dv",@"glk",@"ku",@"pnb",@"mzn"];

NSString *lang = CFBridgingRelease(CFStringTokenizerCopyBestStringLanguage((CFStringRef)astring,CFRangeMake(0,[astring length])));

if (astring.length) {
if ([rightToLeftLanguages containsObject:lang]) {
return NSTextAlignmentRight;
}
}

return NSTextAlignmentLeft;
}

- (void)setText:(NSString *)str { // Override
[super setText:str];

// Split in paragraph
NSArray *paragraphs = [self.text componentsSeparatedByCharactersInSet:[NSCharacterSet newlineCharacterSet]];

// Attributed string for the whole string
NSMutableAttributedString *attribString = [[NSMutableAttributedString alloc]initWithString:self.text];

NSUInteger loc = 0;
for(NSString *paragraph in paragraphs) {

// Find the correct alignment for this paragraph
NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc]init];
[paragraphStyle setAlignment:[WGTextView alignmentForString:paragraph]];

// Find its corresponding range in the string
NSRange range = NSMakeRange(loc, [paragraph length]);

// Add it to the attributed string
[attribString addAttribute:NSParagraphStyleAttributeName value:paragraphStyle range:range];

loc += [paragraph length];
}

[super setAttributedText:attribString];
}

此外,我建议阅读 Unicode BiDi Algorithm管理更复杂的用例。

关于objective-c - UITextView 中的 RTL 和 LTR(双向),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13010396/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com