2013-02-07 17 views
7

Używam niestandardowej czcionki w formacie OpenType (.otf) i chcę użyć czcionki OpenType Features.Uzyskiwanie dostępu do funkcji OpenType w UIKit lub CoreText

Jak mogę to zrobić z UIKit lub CoreText? Oczywiście wolałbym UIKit, ale patrząc na UIFont, opcje są bardzo ograniczone.

Wygląda na to, że kompletny brak dokumentacji dotyczącej obsługi OpenType na iOS, z wyjątkiem tego, że można użyć formatu czcionki.

Powiązana interpretacja: Microsoft's reference for OpenType features, a także kilka informacji o tym, jak browsers are beginning to offer OpenType feature support. Chociaż to pytanie dotyczy renderowania czcionek z funkcjami OpenType w systemie iOS.

Odpowiedz

7

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.

+0

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

+0

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

Powiązane problemy