gpt4 book ai didi

xamarin.ios - 使用 ShowText 时自定义字体无法正确呈现

转载 作者:行者123 更新时间:2023-12-04 02:46:34 25 4
gpt4 key购买 nike

我有一个自定义 View ,我试图在其中使用 Windows 字体 (calibri.ttf) 绘制文本。但是,我在使用 DrawStringShowText 函数时得到了不同的行为。

我已将字体作为应用程序的一部分嵌入(将其添加到 UIAppFonts 列表并将其构建操作设置为 Content)并且我在使用时一切正常我的自定义 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));
}

结果

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

更新 - 这是我使用 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 (Quartz),所以我知道可能存在差异。然而,据我所知,与 DrawString 的唯一区别是它纠正了偏移量差异的问题(CG 位于左下角/UIKit 位于左上角)。

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

最佳答案

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

10 月 12 日更新

a) 你的最后一个代码示例将无法工作,因为 Apple 文档特别是 states不要同时使用 SetFontShowText。报价如下:

Quartz uses font data provided by the system to map each byte of the array through the encoding vector of the current font to obtain the glyph to display. Note that the font must have been set using CGContextSelectFont. Don’t use CGContextShowText in conjunction with CGContextSetFont.

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

关于xamarin.ios - 使用 ShowText 时自定义字体无法正确呈现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7672453/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com