7

OpenType(.otf)形式のカスタムフォントを使用していますが、フォントのOpenType機能の一部を使用したいと思います。

UIKitまたはCoreTextでこれをどのように達成できますか?私は明らかにUIKitを好みますが、 UIFontを見ると、オプションは非常に限られています。

フォント形式を使用できることを除いて、iOSでのOpenTypeサポートに関するドキュメントが完全にないようです。

関連資料:OpenType機能に関するMicrosoftのリファレンス、およびブラウザがOpenType機能のサポートを提供し始めている方法に関する情報。この質問は、iOSでOpenType機能を備えたフォントをネイティブにレンダリングするためのものです。

4

1 に答える 1

7

私が聞いているのは、この暗くて寂しいCore Textの場所にいるコオロギだけなので、自分で見つけた答えを投稿したいと思いました。

答えは、UIKitはフレームワーク内のOpenType機能の設定をサポートしていないため(執筆時点)、コアテキストにドロップダウンする必要があります。幸い、UIKitには追加のフォント機能を公開するAPIがあります。

CTFontDescriptorRefCore Textを使用してテキストを描画する方法については詳しく説明しませんが、関連するアイデアは、テキストの描画に使用されるフォントのすべての属性を定義するを取得する必要があるということです。

サンプルコード:

CTFontDescriptorRef fontDescriptorNoFeatures = CTFontDescriptorCreateWithNameAndSize((__bridge CFStringRef)self.font.fontName, pointSize);

// Set up OpenType Attributes
CFAllocatorRef defaultAllocator = CFAllocatorGetDefault();

int numberSpacing = kNumberSpacingType;
int numberSpacingType = kMonospacedNumbersSelector;

CFNumberRef numberSpacingId = CFNumberCreate(defaultAllocator, kCFNumberIntType, &numberSpacing);
CFNumberRef monospacedNumbersSelector = CFNumberCreate(defaultAllocator, kCFNumberIntType, &numberSpacingType);

CTFontDescriptorRef fontDescriptor = CTFontDescriptorCreateCopyWithFeature(fontDescriptorNoFeatures, numberSpacingId, monospacedNumbersSelector);

CFRelease(fontDescriptorNoFeatures);
CFRelease(numberSpacingId);
CFRelease(monospacedNumbersSelector);

ここで私が行っている主なことは、を使用CTFontDescriptorCreateCopyWithFeature()して、追加機能を備えた通常のフォント記述子のコピーを作成することです。OpenTypeでは「表形式の図」と呼ばれますが、Core Textでは、数字の間隔機能を使用してこの機能にアクセスします(kNumberSpacingType)、で定義された適切な列挙型の値を設定します<CoreText/SFNTLayoutTypes.h>

数値間隔機能の場合、列挙値(何らかの理由でセレクターと呼ばれます!?!)は次のとおりです。

enum {
  kMonospacedNumbersSelector    = 0,
  kProportionalNumbersSelector  = 1,
  kThirdWidthNumbersSelector    = 2,
  kQuarterWidthNumbersSelector  = 3
};

したがって、トリックは、OpenTypeからCoreText機能への直接の1対1のマッピングがないことですが、それらはすべてそこにあるように見えます。定義された定数を調べて機能を特定するという苦痛を経験する必要があります。で<CoreText/SFNTLayoutTypes.h>

残りの問題は、高レベルのビューではなく、Core Textでこのフォントを使用してテキストを描画する必要があることですが、それを行うための参照はたくさんあります。

于 2013-11-13T19:24:35.840 に答える