3

Windows フォント (calibri.ttf) を使用してテキストを描画しようとしているカスタム ビューがあります。ただし、DrawString&ShowText関数を使用すると、動作が異なります。

アプリの一部としてフォントを埋め込みました ( UIAppFontsリストに追加し、そのビルド アクションをContentDrawStringに設定します) 。カスタム 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));
}

結果

DrawString で Calibri フォントを使用する

ただし、今回同じテキストを描画しようと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");
}

結果

FontSpecific エンコーディングと ShowTextAtPoint を使用した結果

更新-MacRomanの代わりにエンコーディングを使用すると、次のようになりFontSpecificます。

MacRoman エンコーディングと 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が UIKitShowTextであり CG (Quartz) であることを知っているので、違いがあるかもしれないことを理解しています。ただし、私が収集したものから、DrawString との唯一の違いは、オフセットの違いの問題を修正したことです (CG は左下にあり、UIKit は左上にあります)。

注 - 私が抱えている根本的な問題は、このフォントを使用して、カスタム CALayerDelegate を介してレイヤーにテキストを描画する必要があることです。そこから関数にアクセスできないDrawStringため、テキストを描画する唯一の方法はShowText. 代替ソリューションは大歓迎です!

4

1 に答える 1

2

これは本当にエンコーディングの問題のようです。CGTextEncoding.MacRomanの代わりに使用してみてくださいCGTextEncoding.FontSpecific(Arial でさえ、FontSpecific では予想どおりレンダリングされません)。

10月12日更新

a) 最後のコード サンプルは動作しません。なぜなら、Apple docでは、 and を一緒に使用しないと明確に述べられているためです。引用に従ってください:SetFontShowText

Quartz は、システムによって提供されるフォント データを使用して、現在のフォントのエンコード ベクトルを介して配列の各バイトをマップし、表示するグリフを取得します。CGContextSelectFont を使用してフォントが設定されている必要があることに注意してください。CGContextShowText を CGContextSetFont と組み合わせて使用​​しないでください。

b)CGTextEncoding.MacRomanコードは、iPhone が提供する他のいくつかのフォントで動作します。iOS でサポートされていないCalibri.ttfフォント自体に関するものではないかと疑い始めています。

于 2011-10-10T21:53:59.087 に答える