Пользовательский шрифт не отображается правильно при использовании ShowText - PullRequest
3 голосов
/ 06 октября 2011

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

Я встроил шрифт как часть приложения (добавил его в список UIAppFonts и установил для его действия сборки значение Content ), и все работает нормально, когда я использую 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));
}

Результат

Using Calibri font with DrawString

Однако, если я попытаюсь нарисовать тот же текст на этот раз, используя 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");
}

Результат

Result using FontSpecific encoding and ShowTextAtPoint

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

Result using MacRoman encoding and 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 (кварц), поэтому я понимаю, что могут быть различия. Однако из того, что я понял, единственное различие с DrawString заключалось в том, что он исправил проблему с разницей в смещении (CG находится внизу слева / UIKit вверху слева).

ПРИМЕЧАНИЕ. - Основная проблема, с которой я столкнулся, заключается в том, что мне нужно использовать этот шрифт для рисования текста на слое с помощью пользовательского CALayerDelegate. У меня нет доступа к функции DrawString, поэтому единственный способ рисования текста - это ShowText. Альтернативные решения приветствуются!

1 Ответ

2 голосов
/ 11 октября 2011

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

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

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

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

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

...