我有一个自定义视图,我正在尝试使用 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));
}
结果
但是,如果我这次尝试绘制相同的文本,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
。欢迎替代解决方案!