Подтвердить что ты не робот

RTL показывает числа в конце строк

Пытаясь отобразить ивритскую строку, начинающуюся с числа, всегда отображает номер в конце строки следующим образом: 1. יום שישי בבוקר

но мне нужно, чтобы номер отображался в правой части текста -

любое решение этого?

Это происходит с UILabel и UITextField и UITextView

и попытка записать число с левой стороны также приведет к такому же отказу.

Игра с комбинациями UITextAlignment не поможет.

4b9b3361

Ответ 1

Вам не нужно изменять какие-либо настройки на UILabel, просто поместите символ с unicode 0x200F перед вашей строкой. Вот почему:

В Юникоде многие символы имеют определенную направленность, что позволяет системе знать, что она должна быть написана, например LTR, как سلام. Параграф обычно использует направление своего первого символа. Поэтому ваша строка без номера автоматически вводится справа налево.

Теперь некоторые символы, например числа, имеют "слабую" направленность, поэтому они в основном воспринимают окружающие. Когда вы вводите "1. בבוקר" , система сначала видит 1, поэтому берет обычное направление LTR. Изменение выравнивания не поможет, поскольку оно просто сдвигает весь текст вправо или в центр.

Чтобы решить эту проблему, Unicode имеет два маркерных символа (LTR: 0x200E, RTL: 200F). Они невидимы, но диктуют направленность. Поэтому, пока "1. בבוקר" ...

  • בבוקר

если вы наберете "# x200F" + "1. בבוקר" , он будет выглядеть следующим образом:

1. בבוקר

Ответ 2

Основываясь на большом ответе Мо:

Это код Obj-C:

NSString *RTFstr = "1. בבוקר"; //This could be any right-to-left string
NSString *directionalString = [@"\u200F" stringByAppendingString:[note text]];
[someUITextView setString:directionalString];

И он действительно работает...

Ответ 3

У меня была немного другая проблема, но ответ Мо дал мне ключ.

Я хотел получить текст LTR (например, "abcd"), отображаемый в RTL-направлении ("dcba"), без необходимости делать реверсирование строк. Оказывается, вставка строки между \u202E и \u202C делает трюк.

Я также рекомендую прочитать следующую страницу, так как она дает очень хорошее объяснение всей этой магии unicode:

http://www.iamcal.com/understanding-bidirectional-text/

Ответ 4

Быстро кто-нибудь?

extension String {
    func stringByForcingWritingDirectionLTR() -> String {
        return "\u{200E}".stringByAppendingString(self)
    }

    func stringByForcingWritingDirectionRTL() -> String {
        return "\u{200F}".stringByAppendingString(self)
    }
}

Ответ 5

Не уверен, есть ли более удобный способ сделать это, но вы можете попробовать что-то вроде этого:

NSString *test = @"12. just a teststring";
NSString *number = [test substringToIndex: [test rangeOfString: @" "].location];
NSString *text = [test substringFromIndex: [test rangeOfString: @" "].location];
test = [NSString stringWithFormat: @"%@ %@", text, number];
// test == "just a teststring 12."