我有一个自定义视图,在该视图中,我试图使用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");
}结果

UPDATE --如果我使用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函数,因此,我看到绘制文本的唯一方法是通过ShowText__。欢迎其他解决方案!
发布于 2011-10-10 21:53:59
这看起来确实是一个编码问题。尝试使用CGTextEncoding.MacRoman而不是CGTextEncoding.FontSpecific (甚至Arial也不会像预期的那样用FontSpecific呈现)。
更新10月12日
( a)您的最后一个代码示例无法工作,因为Apple,特别是州,不会同时使用SetFont和ShowText。引用如下:
石英使用系统提供的字体数据,通过当前字体的编码向量映射数组的每个字节,以获得要显示的字形。注意,字体必须是使用CGContextSelectFont设置的。不要将CGContextShowText与CGContextSetFont结合使用。
( b) CGTextEncoding.MacRoman代码与其他iPhone提供的字体一起工作。我开始怀疑Calibri.ttf字体本身是iOS不支持的。
https://stackoverflow.com/questions/7672453
复制相似问题