Променете посоката на текста на UITextView

моят език не се поддържа от iOS по подразбиране, така че unicode не е опция, така че използвам вграден истински шрифт в UITextView

в по-голямата си част работи, но проблемът ми е като на арабски, а на иврит езикът ми се пише отдясно наляво. Така че трябва да променя посоката на текста (не подравняване на текст).

Направих някои търсения, всички те говорят за NSLocale и други неща, но може ли да се промени в кода? ако мога да го променя на нещо като арабски/иврит, предполагам, че ще работи, но трябва да се направи в код, защото не искам да променям езика на телефона.

така че какви наистина са моите опции за въвеждане на текст? всяка помощ ще бъде оценена.

Благодаря.


person Jinah Adam    schedule 05.02.2011    source източник
comment
Също така искам да внедря същата функционалност като вашата. Искам да внедря клавиатура на урду с посока на текста от отдясно наляво. И така, намерихте ли някакъв начин да получите персонализирани символи от клавиатурата с 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 -Клавиатури, но посоката се връща към стандартната. Бихте ли помогнали, моля, как да интегрирате вашия код с този персонализиран контрол на клавиатурата или друго подобно предложение, просто искате да получите персонализирани символи на клавиатурата с RTL посока на текста. Благодаря. - person hafedh; 05.07.2013
comment
@Max: Аз също искам да внедря същата функционалност като hafedh. Искам да внедря клавиатура на урду с посока на текста от отдясно наляво. И така, намерихте ли някакъв начин да получите персонализирани символи от клавиатурата с RTL посока на текста (както беше споменато от hafedh)? Ако Да, моля, споделете кода тук. Аз също съм в подобна ситуация. Моля помогнете. - person Bhavin; 19.09.2013

Можете да поставите Unicode символ за вграждане отдясно наляво в началото на всеки ред в текстовия изглед.

Име: ВГРАЖДАНЕ ОТ ДЯСНО НАЛЯВО 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" с "‫".

Малко индиректно, не най-доброто решение, но бързо решение.

   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