2011-10-06 131 views
3

我有一个自定义视图,其中我尝试使用Windows字体(calibri.ttf)绘制文本。不过,我在使用功能之间获得不同的行为。使用ShowText时自定义字体无法正确呈现

我有嵌入字体作为应用程序的一部分(将其添加到UIAppFonts列表&设置它的建设行动内容),当我使用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)); 
} 

结果

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

UPDATE - 这是我所得到的,如果我使用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(石英),所以我理解可能有差异。但是,从我所搜集的与DrawString的唯一区别在于它通过偏移(CG左下/ UIKit位于左上角)的不同来纠正问题。

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

+0

你有没有找到这个解决方案? –

+0

@JC Fraid not(因此为什么问题仍然是开放的)。我认为这个问题实际上是Calibri字体和iOS之间的兼容性,但是,还没有得到证实。我最终恢复为使用类似的预建字体(Verdana)。 – James

+1

我发现了一个类似Calibri的字体CartoGothicStd。我不得不从OTF转换为TTF,但它的工作原理。 –

回答

1

这真的看起来像一个编码问题。尝试使用CGTextEncoding.MacRoman而不是CGTextEncoding.FontSpecific(即使Arial不会像预期的那样使用FontSpecific进行渲染)。

UPDATE 10月12日

一)你最后的代码示例不会起作用,因为苹果的文档专门states不使用SetFontShowText在一起。引用如下:

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

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

+0

我尝试了两种方法,并从我记得当我使用'CGTextEncoding.MacRoman'时记得我刚刚得到了一堆问号显示。我重试并发布结果。 – James

+0

发布结果 - 正如我怀疑我收回问号。我毫不怀疑自己这是一个编码问题,但是,我不知道UIKit对CG有什么不同。你能对此有所了解吗? – James

+0

到目前为止,只尝试使用Arial,但我会尝试从Windows VM中找到您的字体以复制该问题。 – poupou