2013-02-07 10 views
7

Sto utilizzando un font personalizzato nel formato OpenType (.otf) e vorrei usare alcuni dei OpenType Features del font.Accesso alle funzionalità OpenType in UIKit o CoreText

Come posso realizzare questo con UIKit o CoreText? Ovviamente preferirei UIKit, ma guardando a UIFont, le opzioni sono estremamente limitate.

Sembra esserci una completa assenza di documentazione relativa al supporto OpenType su iOS, tranne per il fatto che è possibile utilizzare il formato del carattere.

Lettura correlata: Microsoft reference for OpenType features e alcune informazioni su come browsers are beginning to offer OpenType feature support. Anche se questa domanda è per il rendering di caratteri con funzionalità OpenType su iOS in modo nativo.

risposta

7

Dal momento che tutto ciò che sento sono grilli in questo luogo oscuro e solitario di Core Text, ho pensato di pubblicare la risposta che ho trovato da sola.

La risposta è che UIKit non supporta l'impostazione delle funzionalità di OpenType all'interno del suo framework (al momento della scrittura), devi passare a Core Text per farlo, e fortunatamente hanno un'API che espone font aggiuntivi Caratteristiche.

Non entrerò nei dettagli sull'utilizzo di Core Text per disegnare del testo, ma l'idea rilevante è che sarà necessario ottenere uno CTFontDescriptorRef che definisca tutti gli attributi del carattere che verrà utilizzato per disegnare il testo.

codice di esempio:

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); 

La cosa principale che sto facendo qui sta eseguendo una copia, utilizzando CTFontDescriptorCreateCopyWithFeature(), della normale descrittore di carattere con una funzione aggiuntiva, in OpenType è chiamato "Figure tabulari" , ma in Core Text si accederà a questa funzione utilizzando la funzione di spaziatura dei numeri (kNumberSpacingType) e impostando il valore per l'enum appropriato definito in <CoreText/SFNTLayoutTypes.h>.

Per la spaziatura numero di funzione i valori enum (per qualche ragione li chiamano selettori!?!) Sono:

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

Quindi il trucco è non c'è una diretta uno-a-uno mappatura Funzionalità OpenType to CoreText, ma sembra che siano tutti lì, dovrai solo passare attraverso il dolore di identificare la funzionalità guardando attraverso le costanti definite in <CoreText/SFNTLayoutTypes.h>.

Il resto del dolore ora è che devi disegnare il testo con questo tipo di carattere in Core Text, invece di una vista di livello superiore, ma ci sono molti riferimenti là fuori per farlo.

+0

So che questa è una domanda/risposta molto vecchia, ma potrebbe valere la pena di controllare https://developer.apple.com/videos/play/wwdc2016/803/ dal WWDC 2016 in quanto vi sono esempi su come utilizzare il caratteristiche usando 'UIFont' e modificando un descrittore esistente. Intorno a pagina 216 delle diapositive PDF. – liamnichols

+0

Il Core Text ha aggiunto il supporto per il caricamento delle funzionalità di OpenType usando 'kCTFontOpenTypeFeatureTag' e' kCTFontOpenTypeFeatureValue', che sono definiti come OS X 10.10+ e iOS 8.0+ nelle intestazioni Core Text. – andlabs

Problemi correlati