Подтвердить что ты не робот

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];
4b9b3361

Ответ 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;