更改UITextView文本方向
我的语言默认情况下不支持iOS,所以unicode不是一个选项,所以我在UITextView上使用embedded的真正的字体
它的作用大部分,但我的问题就像阿拉伯语,希伯来语我的语言是从右到左写的。 所以我需要改变文本的方向(不是文本alignment)。
我做了一些search,他们都谈论NSLocale和东西,但它可以更改代码? 如果我可以改变它像阿拉伯语/希伯来语它会工作我猜,但它应该在代码中完成,因为我不想改变手机的语言。
所以我的文本input选项是什么? 任何帮助,将不胜感激。
谢谢。
你的问题真的让我感兴趣。 所以在一小时之内,我想出了解决办法。 这是远远不够完美,但你可以使用它,并修复其余的错误。 这是一个带有文本视图的简单视图控制器。 您可以添加input文本,也可以使用设置值
-(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
希望它可以帮助你=)
您可以在文本视图的每一行的开头放置一个“从右到左embedded”的Unicode字符。
名称:右alignmentembeddedUnicode:202B UTF8:E2 80 AB
请注意,这个angular色是不可见的(没有形状)。
下面这段代码用EOL + RTL_EMBEDDINGstringreplace了行尾字符:
appDescription.text = [rtlDescriptionString stringByReplacingOccurrencesOfString:@"\n" withString:@"\n;["
只需使用Unicode 202B字符进行右向左embedded。
例:
uiTextView.text = [NSString stringWithFormat:@“\ u202B%@”,textString];
嗨我认为通过使用UIWebView与HTML和CSS,你可以做的工作
对我来说,简单的把stringjoin到.strings文件中并没有什么好处(最后的结果会直接打印出“202B”部分)。 然而,在从调用返回到localizedStringForKey之后,将\string添加到string中是否有用。
因此,我的解决scheme是,我将任意string“RLE_SYMBOL”直接插入到.strings文件中的string中,然后在调用localizedStringForKey之后,将“RLE_SYMBOL”replace为“\ u202B”。
有点间接,不是最好的解决scheme,而是快速的解决scheme。
mystring = [mystring stringByReplacingOccurrencesOfString:@"RLE_SYMBOL" withString:@"\u202B"];
我一直面临同样的问题。 我的语言类似于阿拉伯语,从右向左书写方向。 对我来说最简单的解决scheme是在每个字符input后,将文本alignment方式更改为右侧,并将光标移动到左侧。 这适用于SWIFT 3.0
func textViewDidChange(_ textView: UITextView) { let newPosition = myTextView.beginningOfDocument myTextView.selectedTextRange = myTextView.textRange(from: newPosition, to: newPosition) print(myTextView.text) return }
Iphone无法正确显示希伯来文和其他从右到左的文本。 所以我觉得没有办法可以改变文本的方向。