Изменить направление текста UITextView

мой язык не поддерживается iOS по умолчанию, поэтому Unicode не подходит, поэтому я использую встроенный шрифт истинного типа в UITextView

это работает по большей части, но моя проблема похожа на арабский язык, а на иврите мой язык пишется справа налево. Поэтому мне нужно изменить направление текста (не выравнивание текста).

я сделал несколько поисков, все они говорят о NSLocale и прочем, но можно ли это изменить в коде? если я смогу изменить его на что-то вроде арабского/иврита, я думаю, это сработает, но это нужно сделать в коде, потому что я не хочу менять язык телефона.

так какие у меня варианты ввода текста? любая помощь будет оценена.

Спасибо.


person Jinah Adam    schedule 05.02.2011    source источник
comment
Я также хочу реализовать ту же функциональность, что и ваша. Я хочу реализовать Urdu Keyboard с направлением текста справа налево. Итак, вы нашли способ получить пользовательские символы клавиатуры с направлением текста RTL (как вы упомянули в своем комментарии под принятым ответом)? Если Да, поделитесь кодом здесь. Я тоже попал в такую ​​ситуацию, как ваша. Пожалуйста помоги.   -  person Bhavin    schedule 19.09.2013


Ответы (7)


Ваш вопрос меня действительно заинтересовал. Итак, за час я нашел решение. Он далек от совершенства, но вы можете использовать его и исправить оставшиеся ошибки. Это простой контроллер представления с текстовым представлением. Вы можете добавить текст, набрав его, или вы можете установить значение, используя

-(void) setText:(NSString*) txt;

Итак, вот код:

ReverseTextVC.h

@interface ReverseTextVC : UIViewController <UITextViewDelegate> {
    NSMutableArray* _lines;
    UITextView* _tv;
}

/**
 Returns reversed text.
 The lines is also updated. This array contains all lines. You should pass this array again if you want to append the text.
 */
+(NSString*) reverseText:(NSString*) text withFont:(UIFont*) font carretPosition:(NSRange*) cpos Lines:(NSMutableArray*) lines Bounds:(CGRect) bounds;

-(void) setText:(NSString*) txt;

@end

ReverseTextVC.m

@implementation ReverseTextVC

-(id) init {
    if( self = [super init] ) {
        _tv = [[UITextView alloc] initWithFrame: CGRectMake(0, 0, 320, 480)];
        _tv.textAlignment = UITextAlignmentRight;
        _tv.delegate = self;
        [self.view addSubview: _tv];
        [_tv release];

        _lines = [[NSMutableArray alloc] initWithCapacity: 10];
        [_lines addObject: [NSMutableString stringWithCapacity: 255]];
    }

    return self;
}

-(void) dealloc {
    [_lines release];

    [super dealloc];
}

-(void) loadView {
    UIView* v = [[UIView alloc] initWithFrame: CGRectMake(0, 20, 320, 480)];
    self.view = v;
    [v release];
}

-(void) setText:(NSString*) txt {
    NSString* result = nil;
    NSRange rng;
    NSArray* words = [txt componentsSeparatedByString: @" "];
    //we should do it iteratively (cause it's the simplest way =) )
    for(NSString* word in words) {
        word = [NSString stringWithFormat: @"%@ ", word];
        for(int i=0; i<[word length]; ++i) {
            NSRange r; r.length = 1; r.location = i;
            result = [ReverseTextVC reverseText: [word substringWithRange: r]
                                                                withFont: _tv.font
                                                      carretPosition: &rng 
                                                                Lines: _lines
                                                              Bounds: _tv.bounds];
        }
    }

    _tv.text = result;
}


#pragma mark -
#pragma mark UITextViewDelegate

-(BOOL) textView:(UITextView*) textView shouldChangeTextInRange:(NSRange) range replacementText:(NSString*) text {
    NSRange rng;

    textView.text = [ReverseTextVC reverseText: text
                                      withFont: textView.font
                                carretPosition: &rng 
                                         Lines: _lines
                                        Bounds: textView.bounds];

    textView.selectedRange = rng;

    return NO;
}


#pragma mark -
#pragma mark Static

+(NSString*) reverseText:(NSString*) text withFont:(UIFont*) font carretPosition:(NSRange*) cpos Lines:(NSMutableArray*) lines Bounds:(CGRect) bounds {
    cpos->length = 0;
    cpos->location = 0;
    if( [text length] ) {
        if( ![text isEqualToString: @"\n"] ) {
            [(NSMutableString*)[lines lastObject] insertString: text
                                                        atIndex: 0];
        } else {
            [lines addObject: [NSMutableString stringWithCapacity: 255]];
        }
    } else {
        //backspace
        //TODO:
        NSRange del_rng;
        del_rng.length = 1;
        del_rng.location = 0;
        if( [(NSMutableString*)[lines lastObject] length] ) {
            [(NSMutableString*)[lines lastObject] deleteCharactersInRange: del_rng];
        }
        if( ![(NSMutableString*)[lines lastObject] length] ) {
            [lines removeLastObject];
        }
    }

    CGSize sz = [(NSString*)[lines lastObject] sizeWithFont: font];
    if( sz.width >= bounds.size.width-15 ) {
        NSMutableArray* words = [NSMutableArray arrayWithArray: [(NSString*)[lines lastObject] componentsSeparatedByString: @" "]];
        NSString* first_word = [words objectAtIndex: 0];
        [words removeObjectAtIndex: 0];
        [(NSMutableString*)[lines lastObject] setString: [words componentsJoinedByString: @" "]];
        [lines addObject: [NSMutableString stringWithString: first_word]];
    }

    NSMutableString* txt = [NSMutableString stringWithCapacity: 100];
    for(int i=0; i<[lines count]; ++i) {
        NSString* line = [lines objectAtIndex: i];
        if( i<([lines count]-1) ) {
            [txt appendFormat: @"%@\n", line];
            cpos->location += [line length]+1;
        } else {
            [txt appendFormat: @"%@", line];
        }
    }

    return txt;
}

@end

Надеюсь вам поможет =)

person Max    schedule 05.02.2011
comment
Действительно полезно, я пытался использовать его с этой пользовательской клавиатурой: github.com/kulpreetchilana/Custom-iOS -Keyboards, но я возвращаю направление по умолчанию. Не могли бы вы помочь, как интегрировать свой код с этим пользовательским элементом управления клавиатурой или любым подобным предложением, просто хотите получить пользовательские символы клавиатуры с направлением текста RTL. Спасибо. - person hafedh; 05.07.2013
comment
@Max: я также хочу реализовать ту же функциональность, что и hafedh. Я хочу реализовать Urdu Keyboard с направлением текста справа налево. Итак, вы нашли способ получить пользовательские символы клавиатуры с направлением текста RTL (как упоминалось hafedh)? Если Да, поделитесь кодом здесь. Я тоже застрял в похожей ситуации. Пожалуйста помоги. - person Bhavin; 19.09.2013

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

Имя: ВРЕЗАНИЕ СПРАВА НАЛЕВО Unicode: 202B UTF8: E2 80 AB

Обратите внимание, что этот персонаж невидим (нет фигур).

Следующий фрагмент кода заменяет символы конца строки строкой EOL+RTL_EMBEDDING:

appDescription.text = [rtlDescriptionString stringByReplacingOccurrencesOfString:@"\n" withString:@"\n‫;["
person Ali Nadalizadeh    schedule 28.06.2011

просто используйте символ Unicode 202B для встраивания справа налево.

Пример:

uiTextView.text = [NSString stringWithFormat:@"‫%@",textString];

person Almog C    schedule 07.02.2012

Привет, я думаю, используя UIWebView с html и css, вы можете выполнить эту работу.

person Osama Ahmed    schedule 06.04.2011
comment
UIWebView используется только для отображения контента. - person Jinah Adam; 07.04.2011

Для меня простое добавление ‫ в строку непосредственно в файл .strings не помогло (конечный результат распечатал бы буквально часть «202B»). Однако добавление ‫ в строку после ее возврата из вызова localizedStringForKey помогает.

Таким образом, в моем решении я вставил произвольную строку «RLE_SYMBOL» непосредственно в строку в файле .strings, затем после вызова localizedStringForKey я заменил «RLE_SYMBOL» на «\ u202B».

Немного косвенное, не лучшее решение, но быстрое решение.

   mystring = [mystring stringByReplacingOccurrencesOfString:@"RLE_SYMBOL" withString:@"\u202B"];
person pretzels1337    schedule 16.01.2013

Я столкнулся с той же проблемой. Мой язык похож на арабский, пишу справа налево. Самым простым решением для меня было изменить выравнивание текста по правому краю и перемещать курсор влево после ввода каждого символа. Это работает на SWIFT 3.0

func textViewDidChange(_ textView: UITextView) {

    let newPosition = myTextView.beginningOfDocument
    myTextView.selectedTextRange = myTextView.textRange(from: newPosition, to: newPosition)

    print(myTextView.text)


    return

}
person Dr.Ax    schedule 02.01.2017

Iphone не может правильно отображать иврит и другие тексты, написанные справа налево. поэтому я думаю, что вы не можете изменить направление текста.

person Faraz Haider    schedule 05.02.2011
comment
Раньше у меня не было проблем с отображением арабского текста, и я предполагаю, что то же самое для иврита, хотя я не могу говорить для ввода текста. - person Jinah Adam; 05.02.2011