3

我有一个自定义视图,我正在尝试使用 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));
}

结果

使用带有 DrawString 的 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 编码和 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 和ShowTextCG (Quartz),所以我知道可能存在差异。然而,从我收集到的与 DrawString 的唯一区别是它纠正了偏移量差异的问题(CG 在左下角/UIKit 在左上角)。

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

4

1 回答 1

2

这看起来确实像一个编码问题。尝试使用CGTextEncoding.MacRoman代替CGTextEncoding.FontSpecific(甚至 Arial 也不会像预期的那样使用 FontSpecific 渲染)。

10月12日更新

a)您的最后一个代码示例将不起作用,因为 Apple 文档特别声明不要一起使用SetFontShowText。引用如下:

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

b) 该CGTextEncoding.MacRoman代码适用于其他几种 iPhone 提供的字体。我开始怀疑这是 iOS 不支持的Calibri.ttf字体本身的问题。

于 2011-10-10T21:53:59.087 回答