2011-02-05 35 views
13

ngôn ngữ của tôi không được hỗ trợ bởi iOS bằng cách mặc định, vì vậy unicode không phải là một lựa chọn vì vậy tôi đang sử dụng một đúng kiểu font nhúng trên một UITextViewThay đổi Text Direction UITextView

nó hoạt động đối với hầu hết các phần, nhưng vấn đề của tôi giống như tiếng Ả Rập, và tiếng Do Thái ngôn ngữ của tôi được viết từ phải sang trái. Vì vậy, tôi cần phải thay đổi hướng của văn bản (Not Text Alignment).

tôi đã thực hiện một số tìm kiếm, tất cả đều nói về NSLocale và nội dung, nhưng nó có thể được thay đổi trong mã không? nếu tôi có thể thay đổi nó thành một cái gì đó như tiếng Ả Rập/tiếng Do Thái nó sẽ làm việc tôi đoán, nhưng nó nên được thực hiện trong mã, bởi vì tôi không muốn thay đổi ngôn ngữ của điện thoại.

vậy các tùy chọn nhập văn bản của tôi thực sự là gì? Bất kỳ trợ giúp sẽ được đánh giá cao.

Cảm ơn.

+0

Tôi cũng muốn triển khai cùng chức năng giống như của bạn. Tôi muốn thực hiện ** Bàn phím tiếng Urdu ** với hướng văn bản từ ** Phải sang trái **. Vì vậy, bạn đã tìm thấy bất kỳ cách nào để có được các ký tự bàn phím tùy chỉnh với hướng văn bản RTL (như bạn đã đề cập trong bình luận của bạn dưới câu trả lời được chấp nhận)? Nếu ** Có ** thì vui lòng chia sẻ mã tại đây. Tôi cũng bị mắc kẹt trong một tình huống như của bạn. Hãy giúp tôi. – Bhavin

+0

[Vui lòng theo liên kết này tại đây để khắc phục sự cố này trên SWIFT] (http://stackoverflow.com/questions/4905500/change-the-uitextview-text-direction/41424462#41424462) –

Trả lời

7

Bạn đã thực sự quan tâm đến tôi. Vì vậy, trong một vài giờ tôi đã đưa ra giải pháp. Nó hoàn hảo, nhưng bạn có thể sử dụng nó và sửa các lỗi còn lại. Đây là bộ điều khiển chế độ xem đơn giản với chế độ xem văn bản. Bạn có thể thêm văn bản gõ nó hoặc bạn có thể thiết lập giá trị sử dụng

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

Vì vậy, đây là mã:

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 

Hy vọng nó sẽ giúp bạn =)

+1

Thực sự vui mừng khi ở đây =) – Max

+0

Thực sự hữu ích, tôi đã cố gắng sử dụng nó với bàn phím tùy chỉnh này: https://github.com/kulpreetchilana/Custom-iOS-Keyboards nhưng tôi nhận được hướng trở về mặc định. Bạn có thể giúp vui lòng làm thế nào để tích hợp mã của bạn với điều khiển bàn phím tùy chỉnh này hoặc bất kỳ sugesstion tương tự, chỉ muốn có được caracters bàn phím tùy chỉnh với hướng văn bản RTL. Cảm ơn. – hafedh

+0

bất kỳ ý tưởng nào vui lòng @Max? – hafedh

-3

Iphone không thể hiển thị chữ Hebrew và các văn bản từ phải sang trái khác chính xác. vì vậy tôi nghĩ rằng không có cách nào của u có thể thay đổi hướng của văn bản.

+0

tôi không có vấn đề nào hiển thị văn bản arabic trước đây, và tôi giả định nó giống nhau cho hebrew, tôi không thể nói cho nhập văn bản mặc dù. –

0

Hi Tôi nghĩ bằng cách sử dụng UIWebView với html và css bạn có thể thực hiện công việc

+0

UIWebView chỉ được sử dụng để hiển thị nội dung. –

9

Bạn có thể đặt ký tự Unicode "từ phải sang trái" ở đầu mỗi dòng trong chế độ xem văn bản.

Tên: từ phải sang trái Nhúng Unicode: 202B UTF8: E2 80 AB

Lưu ý rằng nhân vật này là vô hình (Không hình dạng).

Các đoạn mã sau thay thế end-of-line ký tự với một EOL + RTL_EMBEDDING chuỗi:

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

chỉ cần sử dụng các ký tự Unicode 202B cho từ phải sang trái nhúng.

Ví dụ:

uiTextView.text = [Chuỗi NSStringWithFormat: @ "\ u202B% @", textString];

0

Đối với tôi, chỉ cần thêm \ u202B vào chuỗi trực tiếp vào tệp .strings không thực hiện thủ thuật (Kết quả cuối cùng sẽ in ra nghĩa là in ra phần "202B"). Tuy nhiên, thêm \ u202B vào chuỗi sau khi nó trả về từ cuộc gọi đến localizedStringForKey thực hiện thủ thuật.

Vì vậy, giải pháp của tôi, tôi chèn chuỗi tùy ý "RLE_SYMBOL" trực tiếp vào chuỗi trong tệp .strings, sau đó sau cuộc gọi đến localizedStringForKey tôi thay thế "RLE_SYMBOL" bằng "\ u202B".

Một chút gián tiếp, không phải là giải pháp tốt nhất mà là giải pháp nhanh.

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

Tôi đang đối mặt với cùng một vấn đề. Ngôn ngữ của tôi tương tự như tiếng Ả Rập, viết từ phải sang trái. Giải pháp đơn giản nhất đối với tôi là thay đổi căn chỉnh văn bản sang phải và di chuyển con trỏ sang trái sau mỗi ký tự được nhập. Điều này hoạt động trên SWIFT 3.0

func textViewDidChange(_ textView: UITextView) { 

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

    print(myTextView.text) 


    return 

} 
Các vấn đề liên quan