UITextView неправильно отображает пользовательский шрифт в iOS 7
Мое приложение использует UITextView для ввода сирийского текста (шрифт Estrangelo), но UITextView неправильно отображает некоторые буквы следующим образом:
![enter image description here]()
Я тестировал его с помощью UILabel и UITextView. UILabel отображает его правильно, но UITextView неправильно отображает верхние точки и перемещает их вниз (см. Приведенный выше результат).
Эта проблема возникает только в iOS 7 и не встречается в iOS 6. Скажите, пожалуйста, если есть способ устранить проблему.
Это мой тестовый код
UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 100, 40)];
label.center = CGPointMake(self.view.center.x, self.view.center.y-40);
label.font = [UIFont fontWithName:@"East Syriac Adiabene" size:24];
label.text = @"ܩ̈ ܡ̄ ܬ̇ ܒ̃";
[self.view addSubview:label];
UITextView *textView = [[UITextView alloc] initWithFrame:CGRectMake(0, 0, 100, 40)];
textView.center = CGPointMake(self.view.center.x, self.view.center.y+40);
textView.font = [UIFont fontWithName:@"East Syriac Adiabene" size:24];
textView.text = @"ܩ̈ ܡ̄ ܬ̇ ܒ̃";
[self.view addSubview:textView];
Ответы
Ответ 1
Я немного отладил эту проблему, и, похоже, это ошибка в способе NSLayoutManager
раскладки текста. Как указывалось в других ответах, UITextView
строится вокруг TextKit с iOS7 и, таким образом, использует NSLayoutManager
внутри текста макета. UILabel
напрямую использует основной текст для текста макета. Оба в конечном итоге используют Core Text для отображения глифов.
Вам следует открыть отчет об ошибке с Apple и опубликовать номер, чтобы люди могли его дублировать. Проблема пока не исправлена в бета-версии iOS7.1.
В качестве обходного решения вы можете заменить UITextView
другими альтернативными редакторами Core Text, которые компоноваются и визуализируются напрямую с помощью Core Text, где проблема не существует.
Я протестировал SECoreTextView
, и он правильно показывает текст. Он реализует аналогичный API для UITextView
, но внутренне использует Core Text.
Вот как это выглядит после замены UITextView
на SECoreTextView
:
SETextView *textView = [[SETextView alloc] initWithFrame:CGRectMake(0, 0, 100, 40)];
textView.center = CGPointMake(self.view.center.x, self.view.center.y+40);
textView.font = [UIFont fontWithDescriptor:desc size:24];
textView.text = @"ܩ̈ ܡ̄ ܬ̇ ܒ̃";
textView.textColor = [UIColor blackColor];
textView.backgroundColor = [UIColor whiteColor];
textView.editable = YES;
[self.view addSubview:textView];
![Using Core Text, the layout issue does not exist.]()
Ответ 2
Несколько дней назад у меня была такая же проблема, как у вас в iOS 7
(но шрифт был другим).
Я установил FONT после установки ТЕКСТ, и это сработало для меня. Итак, для вашего случая:
textView.text = @"ܩ̈ ܡ̄ ܬ̇ ܒ̃"; // Setting the text.
textView.font = [UIFont fontWithName:@"East Syriac Adiabene" size:24]; // Setting the font and it size.
Это может показаться глупым, но это сработало для меня.
Также см. этот вопрос/ответ. Существует множество советов по использованию пользовательских шрифтов с UITextView
, которые могут вам помочь.
EDIT:
iOS 7 также представила новое свойство selectable
на UITextView
для включения выбора текста. Поэтому убедитесь, что вы сделали следующее:
self.textField.editable = YES;
self.textField.selectable = ON;