3

RTL と LTR の両方でフォーマットされたテキスト行を含む UITextView のコンテンツを保存しようとしています。問題は、UITextView がフォーマット方向の最初の文字のみをチェックすることです。私が「編集」モードにいると仮定して、このテキストを書きましょう ( _ _ はスペースを意味します):

text1_______________________________________
____________________________________________אקסא      
text2_______________________________________

保存後、 אקסאの RTL が失われました。ここで、このテキストをもう一度編集したいと思います。これは次のようになります。

text1_______________________________________
אקסא      
text2_______________________________________

1 つの UITextView で \u200F と \u200E 方向文字を混在させることができません。これを管理し、UITextView から双方向テキストを正しく保存するにはどうすればよいですか?

4

1 に答える 1

1

を使用した概念の簡単な証明は次の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を読むことをお勧めします。

于 2017-01-02T11:37:25.547 に答える