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.
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
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