#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));
}
Результат
Однако, если я попытаюсь нарисовать тот же текст на этот раз, используя 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");
}
Результат
ОБНОВЛЕНИЕ — вот что я получаю, если использую MacRoman
кодировку вместо FontSpecific
:
Я также пытался загрузить шрифт вручную и использовать его, но тогда я вообще ничего не получаю, как будто он не распознает шрифт, например
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
, делает).