Изменить текстовое направление UITextView
Мой язык по умолчанию не поддерживается iOS, поэтому Unicode не вариант, поэтому я использую встроенный шрифт истинного типа в UITextView
это работает по большей части, но моя проблема похожа на арабский, и иврит мой язык написан справа налево. Поэтому мне нужно изменить направление текста (не выравнивание текста).
Я сделал некоторые поиски, все они говорят о NSLocale и прочем, но можно ли это изменить в коде? если бы я мог изменить его на что-то вроде арабского / иврита, это бы сработало, я думаю, но это должно быть сделано в коде, потому что я не хочу менять язык телефона.
так что на самом деле мои варианты ввода текста? любая помощь будет оценена.
Благодарю.
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
Надеюсь, это поможет вам =)
Вы можете поместить символ Unicode "встраивание справа налево" в начале каждой строки в текстовом представлении.
Название: ВСТАВКА ПРАВО НА ЛЕВОЙ Юникод: 202B UTF8: E2 80 AB
Обратите внимание, что этот персонаж невидим (без фигур).
Следующий фрагмент кода заменяет символы конца строки строкой EOL+RTL_EMBEDDING:
appDescription.text = [rtlDescriptionString stringByReplacingOccurrencesOfString:@"\n" withString:@"\n;["
Просто используйте символ Unicode 202B для ВПРАВО вправо-влево.
Пример:
uiTextView.text = [NSString stringWithFormat: @ "\ u202B% @", textString];
Привет, я думаю, что с помощью UIWebView с HTML и CSS вы можете сделать эту работу
Я столкнулся с той же проблемой. Мой язык похож на арабский, пишу справа налево. Самым простым решением для меня было изменить выравнивание текста вправо и переместить курсор влево после ввода каждого символа. Это работает на SWIFT 3.0
func textViewDidChange(_ textView: UITextView) {
let newPosition = myTextView.beginningOfDocument
myTextView.selectedTextRange = myTextView.textRange(from: newPosition, to: newPosition)
print(myTextView.text)
return
}
Для меня просто добавление \u202B в строку непосредственно в файл.strings не помогло (конечный результат должен был распечатать буквально распечатанную часть "202B"). Однако добавление \u202B в строку после ее возвращения из вызова localizedStringForKey делает свое дело.
Таким образом, мое решение, я вставил произвольную строку "RLE_SYMBOL" непосредственно в строку в файле.strings, затем после вызова localizedStringForKey я заменил "RLE_SYMBOL" на "\u202B".
Немного косвенный, не самое лучшее решение, но быстрое решение.
mystring = [mystring stringByReplacingOccurrencesOfString:@"RLE_SYMBOL" withString:@"\u202B"];
Iphone не может правильно отображать иврит и другие тексты справа налево. так что я думаю, что вы не можете изменить направление текста.