2011-02-05 53 views
13

我的語言不受iOS的默認支持,所以unicode是不是一種選擇,所以我使用一個UITextView更改UITextView的文字方向

它的作品大部分嵌入了True Type字體,但我的問題就像阿拉伯語,希伯來語我的語言是從右向左書寫的。所以我需要改變文字的方向(不是文字對齊)。

我做了一些搜索,他們都談論NSLocale和東西,但它可以在代碼中進行更改嗎?如果我可以把它改成阿拉伯語/希伯來語這樣的東西,我想它會起作用,但它應該在代碼中完成,因爲我不想改變手機的語言。

那麼我的文本輸入選項是什麼?任何幫助,將不勝感激。

謝謝。

+0

我還希望實現與您的功能相同的功能。我想實現**烏爾都語鍵盤**,文本方向從**右到左**。所以,你有沒有找到任何方法來獲取RTL文本方向的自定義鍵盤字符(正如你在接受答案下的評論中提到的那樣)?如果**是**,請在此分享代碼。我也陷入了像你這樣的狀況。請幫忙。 – Bhavin 2013-09-19 05:41:30

+0

[請按照此鏈接在SWIFT上解決此問題](http://stackoverflow.com/questions/4905500/change-the-uitextview-text-direction/41424462#41424462) – 2017-01-02 09:53:10

回答

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 

希望它可以幫助你=)

+1

真的很高興在這裏=) – Max 2011-02-05 13:03:38

-3

Iphone無法正確顯示希伯來文和其他從右到左的文本。所以我認爲你沒有辦法改變文本的方向。

+0

我有沒有問題顯示阿拉伯文本之前,我認爲它與希伯來文相同,我不能說文字輸入雖然。 – 2011-02-05 11:40:25

0

嗨 我認爲通過使用帶有html和css的UIWebView可以完成這項工作

9

您可以在文本視圖中的每一行的開始處放置一個「從右到左嵌入」的Unicode字符。

名稱:從右到左嵌入 的Unicode:202B UTF8:E2 80 AB

注意,這個人物是無形的(無形狀)。

下面一段代碼替換結束一行中字符與EOL + RTL_EMBEDDING字符串:

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

只是使用Unicode字符202B爲從右到左嵌入。例如:

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

0

對我來說,直接在字符串中直接加入\ u222B到.strings文件中並沒有這樣的技巧(最終結果會打印出真正的「202B」部分)。但是,在從調用返回到localizedStringForKey之後,將字符串添加到字符串中是否有用。

因此,我的解決方案是,將任意字符串「RLE_SYMBOL」直接插入到.strings文件的字符串中,然後在調用localizedStringForKey之後,將「RLE_SYMBOL」替換爲「\ u202B」。

有點間接,不是最好的解決方案,而是快速的解決方案。

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

我一直面臨同樣的問題。我的語言類似於阿拉伯語,從右向左書寫方向。對我來說,最簡單的解決方案是將文本對齊方式更改爲右側,並在每個字符輸入後將光標移動到左側。這適用於SWIFT 3.0

func textViewDidChange(_ textView: UITextView) { 

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

    print(myTextView.text) 


    return 

}