2013-02-07 43 views
7

में ओपनटाइप सुविधाओं तक पहुंच मैं ओपनटाइप (.otf) प्रारूप में एक कस्टम फ़ॉन्ट का उपयोग कर रहा हूं और फ़ॉन्ट के OpenType Features का उपयोग करना चाहता हूं।UIKit या CoreText

मैं इसे UIKit या CoreText के साथ कैसे पूरा कर सकता हूं? मैं स्पष्ट रूप से UIKit पसंद करूंगा, लेकिन UIFont पर देख रहा हूं, विकल्प बेहद सीमित हैं।

आईओएस पर ओपनटाइप समर्थन के संबंध में दस्तावेज़ीकरण की पूरी अनुपस्थिति प्रतीत होती है, सिवाय इसके कि फ़ॉन्ट प्रारूप का उपयोग किया जा सकता है।

संबंधित पढ़ने: माइक्रोसॉफ्ट के reference for OpenType features, और browsers are beginning to offer OpenType feature support पर कुछ जानकारी। हालांकि यह प्रश्न आईओएस पर ओपनटाइप सुविधाओं के साथ फ़ॉन्ट्स को प्रस्तुत करने के लिए है।

उत्तर

7

चूंकि मैं सुन रहा हूं, इस अंधेरे और अकेले कोर टेक्स्ट स्थान में क्रिकेट हैं, मैंने सोचा कि मैं अपने उत्तर में जो उत्तर मिला हूं उसे पोस्ट करूंगा।

उत्तर यह है कि UIKit अपने ढांचे के भीतर ओपनटाइप सुविधाओं की सेटिंग का समर्थन नहीं करता है (लिखने के समय), आपको इसे करने के लिए कोर टेक्स्ट पर जाना होगा, और सौभाग्य से उनके पास एक एपीआई है जो अतिरिक्त फ़ॉन्ट का खुलासा करती है विशेषताएं।

मैं टेक्स्ट खींचने के लिए कोर टेक्स्ट का उपयोग करने के बारे में विस्तार से नहीं जाऊंगा, लेकिन प्रासंगिक विचार यह है कि आपको CTFontDescriptorRef प्राप्त करने की आवश्यकता होगी जो आपके टेक्स्ट को आकर्षित करने के लिए उपयोग किए जाने वाले फ़ॉन्ट के सभी विशेषताओं को परिभाषित करता है।

नमूना कोड:

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() का उपयोग कर, एक अतिरिक्त सुविधा के साथ सामान्य फ़ॉन्ट वर्णनकर्ता की, ओपन टाइप में यह कहा जाता है "सारणीबद्ध आंकड़े" , लेकिन कोर टेक्स्ट में आप नंबर स्पेसिंग सुविधा (kNumberSpacingType) का उपयोग कर इस सुविधा तक पहुंचेंगे, और <CoreText/SFNTLayoutTypes.h> में परिभाषित उपयुक्त एनम के लिए मान सेट करेंगे।

संख्या रिक्ति के लिए enum मूल्यों की सुविधा (किसी कारण से वे उन्हें चयनकर्ताओं कहते हैं!?!) कर रहे हैं:

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

तो चाल वहाँ है का एक सीधा एक-से-एक मानचित्रण है नहीं CoreText सुविधाओं के लिए ओपनटाइप, लेकिन ऐसा लगता है कि वे सभी वहां हैं, आपको <CoreText/SFNTLayoutTypes.h> में परिभाषित स्थिरांक को देखकर सुविधा की पहचान करने के दर्द को दूर करने की आवश्यकता होगी।

बाकी दर्द अब आपको उच्च स्तर के दृश्य के बजाय कोर टेक्स्ट में इस फ़ॉन्ट के साथ टेक्स्ट खींचना है, लेकिन ऐसा करने के लिए वहां बहुत से संदर्भ हैं।

+0

मुझे पता है कि यह वास्तव में एक पुराना प्रश्न/उत्तर है, लेकिन यह डब्ल्यूडब्ल्यूडीसी 2016 से https://developer.apple.com/videos/play/wwdc2016/803/ को देखने के लायक हो सकता है क्योंकि इसका उपयोग कैसे करें 'UIFont' का उपयोग करके और मौजूदा डिस्क्रिप्टर को संशोधित करने वाली विशेषताएं। पीडीएफ स्लाइड के पेज 216 के आसपास। – liamnichols

+0

कोर टेक्स्ट ने कोर टेक्स्ट हेडर में 'केसीटीएफओटी ओपन टाइप टाइप फीचर' और 'केसीटीएफओटी ओपन टाइप टाइप फीचर' का उपयोग करके ओपनटाइप सुविधाओं को लोड करने के लिए समर्थन जोड़ा, जिसे ओएस एक्स 10.10+ और आईओएस 8.0+ के रूप में परिभाषित किया गया है। – andlabs