Пользовательский шрифт отображается некорректно при использовании showText

#xamarin.ios #core-graphics #truetype #custom-font

#xamarin.ios #ядро-графика #truetype #пользовательский шрифт

Вопрос:

У меня есть пользовательский вид, в котором я пытаюсь нарисовать текст, используя шрифт Windows (calibri.ttf). Тем не менее, я получаю различное поведение при использовании функций DrawString amp; ShowText .

Я встроил шрифт как часть приложения (добавил его в список UIAppFonts и установил его действие сборки для содержимого), и все работает нормально, когда я использую DrawString метод из моего пользовательского UIView, например

Код

 public override void Draw (System.Drawing.RectangleF rect)
{
    base.Draw (rect);
    DrawString("Calibri font via DrawString", new RectangleF(10, 10, 100, 100), UIFont.FromName("Calibri", 16f));
}
  

Результат

Использование шрифта Calibri со шнурком

Однако, если я попытаюсь нарисовать тот же текст на этот раз, используя ShowText его, кажется, что шрифт неправильно кодирует текст или отображение символов неверно.

Код

 public override void Draw (System.Drawing.RectangleF rect)
{
    base.Draw (rect);
    var ctx = UIGraphics.GetCurrentContext();
    ctx.SelectFont("Calibri", 16f, MonoTouch.CoreGraphics.CGTextEncoding.FontSpecific);
    ctx.ShowTextAtPoint(10, 10, "Calibri font via ShowText using SelectFont");
}
  

Результат

Результат с использованием FontSpecific encoding и ShowTextAtPoint

ОБНОВЛЕНИЕ — вот что я получаю, если использую MacRoman кодировку вместо FontSpecific :

Результат с использованием кодировки MacRoman и ShowTextAtPoint

Я также пытался загрузить шрифт вручную и использовать его, но тогда я вообще ничего не получаю, как будто он не распознает шрифт, например

 var fontPath = NSBundle.MainBundle.PathForResource("calibri", "ttf");
var provider = new CGDataProvider(fontPath);
var font = CGFont.CreateFromProvider(provider);

var ctx = UIGraphics.GetCurrentContext();
ctx.SetFont(font);
ctx.ShowTextAtPoint(10, 20, "Calibri font via ShowText using SetFont");
  

Я знаю, что DrawString это UIKit и ShowText CG (Quartz), поэтому я понимаю, что могут быть различия. Однако, из того, что я понял, единственным отличием DrawString было то, что он исправил проблему с разницей в смещении (CG находится внизу слева / UIKit находится вверху слева).

Основная проблема, с которой я сталкиваюсь, заключается в том, что мне нужно использовать этот шрифт для рисования текста на слое с помощью пользовательского CALayerDelegate. У меня нет доступа к DrawString функции оттуда, поэтому единственный способ, который я вижу, чтобы нарисовать текст, — это via ShowText . Альтернативные решения приветствуются!

Комментарии:

1. @JC Боюсь, что нет (следовательно, вопрос все еще открыт). Я действительно думаю, что проблема на самом деле заключается в совместимости между Calibri font и iOS, однако ее еще предстоит подтвердить. В конце концов я вернулся к использованию аналогичного готового шрифта (Verdana).

2. Я нашел шрифт, похожий на Calibri, под названием CartoGothicStd. Мне пришлось конвертировать из OTF в TTF, но это работает.

Ответ №1:

Это действительно похоже на проблему с кодировкой. Попробуйте использовать CGTextEncoding.MacRoman вместо CGTextEncoding.FontSpecific (даже Arial не будет отображаться, как ожидалось, с FontSpecific).

ОБНОВЛЕНИЕ 12 октября

a) ваш последний пример кода не будет работать, потому что в документе Apple doc специально указано не использовать SetFont и ShowText вместе. Цитата следует:

Quartz использует данные шрифта, предоставленные системой, для сопоставления каждого байта массива с вектором кодирования текущего шрифта, чтобы получить отображаемый глиф. Обратите внимание, что шрифт должен быть установлен с помощью CGContextSelectFont . Не используйте CGContextShowText в сочетании с CGContextSetFont .

б) CGTextEncoding.MacRoman код работает с несколькими другими шрифтами, поставляемыми для iPhone. Я начинаю подозревать, что это связано с самим шрифтом Calibri.ttf, который не поддерживается iOS.

Комментарии:

1. Я пробовал оба варианта, и из того, что я помню, когда я использовал CGTextEncoding.MacRoman , я только что получил кучу вопросительных знаков. Я повторяю попытку и публикую результаты.

2. Опубликовал результат — как я и подозревал, я возвращаю вопросительные знаки. Я сам не сомневаюсь, что это проблема с кодировкой, однако я не знаю, что UIKit делает по-другому с CG. Не могли бы вы пролить некоторый свет на это?

3. Пока пробовал только с Arial, но я попытаюсь найти ваш шрифт (с виртуальной машины Windows), чтобы дублировать проблему.

4. Блестящее спасибо, вы должны найти Calibri.ttf в C:WindowsFonts папке в окне Windows.

5. 1 Спасибо за расследование этого. Однако, что касается использования SetFont и ShowText …. как еще вы устанавливаете шрифт ShowText , поскольку он не позволяет вам указывать, какой использовать (например DrawString , делает).