我有一个自定义视图,我尝试使用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));
}
结果
但是,如果我这次使用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的唯一区别在于它更正了Offset的差异(CG位于左下角/ UIKit位于左上角)。
注意 - 我遇到的根本问题是我需要使用此字体通过自定义CALayerDelegate将文本绘制到图层上。我无法访问其中的DrawString
函数,因此,我可以看到绘制文本的唯一方法是通过ShowText
。欢迎提供其他解决方案!
答案 0 :(得分:2)
这看起来像编码问题。尝试使用CGTextEncoding.MacRoman
代替CGTextEncoding.FontSpecific
(即使Arial也无法按预期使用FontSpecific呈现)。
10月12日更新
a)您的上一个代码示例无法正常运行,因为Apple文档专门states不能同时使用SetFont
和ShowText
。引用如下:
Quartz使用系统提供的字体数据通过当前字体的编码向量映射数组的每个字节,以获得要显示的字形。请注意,必须使用CGContextSelectFont设置字体。不要将CGContextShowText与CGContextSetFont结合使用。
b)CGTextEncoding.MacRoman
代码与其他几种iPhone提供的字体一起使用。我开始怀疑它是关于iOS不支持的 Calibri.ttf 字体本身。