私が聞いているのは、この暗くて寂しいCore Textの場所にいるコオロギだけなので、自分で見つけた答えを投稿したいと思いました。
答えは、UIKitはフレームワーク内のOpenType機能の設定をサポートしていないため(執筆時点)、コアテキストにドロップダウンする必要があります。幸い、UIKitには追加のフォント機能を公開するAPIがあります。
CTFontDescriptorRef
Core 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でこのフォントを使用してテキストを描画する必要があることですが、それを行うための参照はたくさんあります。