Ponieważ wszystko, co słyszę, to świerszcze w tym mrocznym i samotnym miejscu Core Text, pomyślałem, że opublikuję odpowiedź, którą znalazłem na własną rękę.
Odpowiedź: UIKit nie obsługuje ustawienia funkcji OpenType w ramach (w czasie pisania), musisz przejść do Core Text, aby to zrobić, i na szczęście mają interfejs API, który udostępnia dodatkową czcionkę cechy.
Nie będę wdawać się w szczegóły dotyczące używania Tekstu Core do narysowania tekstu, ale właściwym pomysłem jest, aby uzyskać CTFontDescriptorRef
, który definiuje wszystkie atrybuty czcionki, która będzie używana do rysowania tekstu.
Przykładowy kod:
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);
najważniejsze robie tu robi kopię, używając CTFontDescriptorCreateCopyWithFeature()
, normalnego deskryptora czcionki z dodatkową funkcją, w OpenType jest nazywany „tabelaryczne Figury” , ale w Core Text uzyskasz dostęp do tej funkcji za pomocą funkcji odstępów między wierszami (kNumberSpacingType
) i ustaw wartość odpowiedniego wyliczenia zdefiniowanego w <CoreText/SFNTLayoutTypes.h>
.
Dla rozstawu numer wyposażone wartości enum (z jakiegoś powodu nazywają je selektorów!?!) To:
enum {
kMonospacedNumbersSelector = 0,
kProportionalNumbersSelector = 1,
kThirdWidthNumbersSelector = 2,
kQuarterWidthNumbersSelector = 3
};
Dlatego sztuką jest tam nie jest bezpośrednim jeden do jeden odwzorowanie OpenType do funkcji CoreText, ale wygląda na to, że wszystko tam jest, wystarczy przejść przez trud identyfikacji funkcji, przeglądając stałe zdefiniowane w <CoreText/SFNTLayoutTypes.h>
.
Reszta bólu polega na tym, że musisz narysować tekst czcionką w tekście głównym, zamiast widoku wyższego poziomu, ale istnieje wiele odnośników do tego.
Wiem, że to naprawdę stare pytanie/odpowiedź, ale warto sprawdzić https://developer.apple.com/videos/play/wwdc2016/803/ z WWDC 2016, ponieważ istnieją przykłady, jak korzystać z funkcje korzystające z 'UIFont' i modyfikujące istniejący deskryptor. Na stronie 216 slajdów PDF. – liamnichols
Core Text dodano obsługę ładowania funkcji OpenType za pomocą 'kCTFontOpenTypeFeatureTag' oraz' kCTFontOpenTypeFeatureValue', które są zdefiniowane jako OS X 10.10+ i iOS 8.0+ w nagłówkach Core Text. – andlabs