2011-02-05 20 views
13

la mia lingua non è supportato da iOS di default, così unicode non è un'opzione in modo che io sto usando un font true type incorporato in un UITextViewModificare la direzione del testo UITextView

funziona per la maggior parte, ma il mio problema è come l'arabo, e l'ebraico la mia lingua è scritta da destra a sinistra. Quindi ho bisogno di cambiare la direzione del testo (non allineamento del testo).

ho fatto alcune ricerche, tutti parlano di NSLocale e cose del genere, ma può essere modificato in codice? se posso cambiarlo in qualcosa di simile all'arabo/ebraico funzionerebbe credo, ma dovrebbe essere fatto in codice, perché non voglio cambiare la lingua del telefono.

quindi quali sono veramente le mie opzioni per l'immissione di testo? Qualsiasi aiuto sarebbe apprezzato.

Grazie.

+0

Voglio anche implementare la stessa funzionalità come la tua. Voglio implementare ** Urdu Keyboard ** con direzione del testo da ** Right a Left **. Quindi, hai trovato un modo per ottenere caratteri personalizzati della tastiera con la direzione del testo RTL (come hai menzionato nel tuo commento sotto la risposta accettata)? Se ** Sì **, per favore condividi il codice qui. Sono anche bloccato in una situazione come la tua. Per favore aiuto. – Bhavin

+0

[Si prega di seguire questo collegamento qui per una correzione per questo problema su SWIFT] (http://stackoverflow.com/questions/4905500/change-the-uitextview-text-direction/41424462#41424462) –

risposta

7

La domanda mi ha davvero interessato. Quindi nel giro di un'ora ho trovato una soluzione. È tutt'altro che perfetto, ma puoi usarlo e correggere i bug rimanenti. Questo è un semplice controller di visualizzazione con visualizzazione testo. È possibile aggiungere testo digitandolo oppure è possibile impostare il valore utilizzando

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

Quindi, ecco il codice:

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 

Spero che ti aiuti =)

+1

Davvero contento di questo =) – Max

+0

Davvero utile, ho provato a usarlo con questa tastiera personalizzata: https://github.com/kulpreetchilana/Custom-iOS-Keyboards ma ottengo la direzione restituita di default. Puoi aiutare per favore come integrare il tuo codice con questo controllo personalizzato della tastiera o qualsiasi altra idea simile, vuoi solo ottenere caratteri personalizzati con la direzione del testo RTL. Grazie. – hafedh

+0

qualche idea per favore @Max? – hafedh

-3

L'Iphone non può visualizzare correttamente l'ebraico e altri testi da destra a sinistra. quindi penso che non ci sia modo di cambiare la direzione del testo.

+0

non ho avuto problemi di visualizzazione testo arabo prima, e presumo che sia lo stesso per l'ebraico, non posso parlare per l'input di testo però. –

0

Hi Penso che usando UIWebView con html e css puoi fare il lavoro

+0

UIWebView viene utilizzato solo per la visualizzazione del contenuto. –

9

Puoi inserire un carattere Unicode "da destra a sinistra" all'inizio di ogni riga nella visualizzazione del testo.

Nome: da destra a sinistra INCASSO Unicode: 202B UTF8: E2 80 AB

Nota che questo personaggio è invisibile (No forme).

Il seguente pezzo di codice sostituisce i caratteri di fine linea con una stringa EOL + RTL_EMBEDDING:

appDescription.text = [rtlDescriptionString stringByReplacingOccurrencesOfString:@"\n" withString:@"\n‫;[" 
4

basta usare il carattere Unicode 202B per destra a sinistra INCASSO.

Esempio:

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

0

Per me semplicemente aggiungere il file \ u202B nella stringa direttamente nel file .strings non ha risolto il problema (il risultato finale avrebbe stampato letteralmente la parte "202B"). Tuttavia, l'aggiunta di \ u202B nella stringa dopo il suo ritorno dalla chiamata a localizedStringForKey fa il trucco.

Quindi, la mia soluzione, ho inserito la stringa arbitraria "RLE_SYMBOL" direttamente nella stringa nel file .strings, quindi dopo la chiamata a localizedStringForKey sostituisco "RLE_SYMBOL" con "\ u202B".

Un po 'indiretto, non la soluzione migliore ma una soluzione rapida.

mystring = [mystring stringByReplacingOccurrencesOfString:@"RLE_SYMBOL" withString:@"\u202B"]; 
0

Ho affrontato lo stesso problema. La mia lingua è simile all'arabo, scrivendo da destra a sinistra. La soluzione più semplice per me era cambiare l'allineamento del testo a destra e spostare il cursore a sinistra dopo che ogni carattere è stato inserito. Funziona su SWIFT 3.0

func textViewDidChange(_ textView: UITextView) { 

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

    print(myTextView.text) 


    return 

} 
Problemi correlati