使用ShowText时,自定义字体无法正确呈现

时间:2011-10-06 09:28:48

标签: xamarin.ios core-graphics true-type-fonts custom-font

我有一个自定义视图,我尝试使用Windows字体(calibri.ttf)绘制文本。但是,我在使用DrawString& ShowText函数。

我已将字体嵌入应用程序的一部分(将其添加到 UIAppFonts 列表并将其构建操作设置为内容)并且我工作正常使用我的自定义UIView中的DrawString方法,例如

代码

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

更新 - 如果我使用MacRoman编码代替FontSpecific,我会得到以下内容:

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(Quartz)所以我理解可能存在差异。然而,根据我收集的内容,与DrawString的唯一区别在于它更正了Offset的差异(CG位于左下角/ UIKit位于左上角)。

注意 - 我遇到的根本问题是我需要使用此字体通过自定义CALayerDelegate将文本绘制到图层上。我无法访问其中的DrawString函数,因此,我可以看到绘制文本的唯一方法是通过ShowText。欢迎提供其他解决方案!

1 个答案:

答案 0 :(得分:2)

这看起来像编码问题。尝试使用CGTextEncoding.MacRoman代替CGTextEncoding.FontSpecific(即使Arial也无法按预期使用FontSpecific呈现)。

10月12日更新

a)您的上一个代码示例无法正常运行,因为Apple文档专门states不能同时使用SetFontShowText。引用如下:

  

Quartz使用系统提供的字体数据通过当前字体的编码向量映射数组的每个字节,以获得要显示的字形。请注意,必须使用CGContextSelectFont设置字体。不要将CGContextShowText与CGContextSetFont结合使用。

b)CGTextEncoding.MacRoman代码与其他几种iPhone提供的字体一起使用。我开始怀疑它是关于iOS不支持的 Calibri.ttf 字体本身。