UIFont और CTFont iOS में फ़ॉन्ट के साथ काम करने के लिए क्लास हैं: UILabel और UITextView में उच्च-स्तरीय टेक्स्ट कॉन्फ़िगरेशन के लिए UIKit से UIFont, ग्लिफ़ और मीट्रिक पर पूर्ण नियंत्रण के साथ निम्न-स्तरीय रेंडरिंग के लिए Core Text से CTFont। Apple Developer Documentation के अनुसार, UIFont का उपयोग 90% मानक UI घटकों में किया जाता है, जबकि CTFont का उपयोग कस्टम टेक्स्ट इंजन और संपादकों में किया जाता है। दोनों क्लास एक ही फ़ॉन्ट को दर्शाते हैं लेकिन अलग-अलग स्तर के एब्स्ट्रैक्शन पर।
मुख्य बातें
UIFont एक UIKit क्लास है जो UI घटकों में टेक्स्ट प्रदर्शित करने के लिए फ़ॉन्ट का प्रतिनिधित्व करता है: UILabel, UITextView, UITextField। यह निर्दिष्ट आकार, वज़न और शैली के साथ सिस्टम और कस्टम फ़ॉन्ट प्राप्त करने के लिए एक सरल इंटरफ़ेस प्रदान करता है। UIFont कर्निंग, लिगेचर और OpenType सुविधाओं पर सीधा नियंत्रण नहीं देता — इसके लिए Core Text का उपयोग किया जाता है।
CTFont एक Core Text प्रकार (CTFontRef) है जो फ़ॉन्ट डेटा तक निम्न-स्तरीय पहुँच प्रदान करता है। CTFont रेंडरिंग के लिए सीधे Core Graphics के साथ काम करता है, वैकल्पिक ग्लिफ़, लिगेचर और वेरिएबल फ़ॉन्ट सहित सभी OpenType और TrueType सुविधाओं का समर्थन करता है। CTFont आंतरिक रूप से UIFont को रेंडर करने के लिए UIKit द्वारा उपयोग किया जाता है लेकिन कस्टम ड्रॉइंग के लिए सीधे भी उपलब्ध है।
UIFont और CTFont toll-free bridging का समर्थन करते हैं — बिना किसी अतिरिक्त लागत के प्रकारों के बीच रूपांतरण। Swift और Objective-C में UIFont को CTFont या CTFont को UIFont के रूप में कास्ट करना संभव है। यह कॉन्फ़िगरेशन के लिए उच्च-स्तरीय UIKit API और फ़ॉन्ट डेटा की प्रतिलिपि बनाए बिना रेंडरिंग के लिए निम्न-स्तरीय Core Text का उपयोग करने की अनुमति देता है।
दोनों क्लास फ़ॉन्ट विशेषताओं का वर्णन करने के लिए UIFontDescriptor (UIKit) / CTFontDescriptor (Core Text) का उपयोग करते हैं: नाम, आकार, वज़न, शैली, परिवर्तन मैट्रिक्स। डिस्क्रिप्टर विशेषताओं का एक शब्दकोश है जिसे मौजूदा फ़ॉन्ट के आधार पर नए फ़ॉन्ट बनाने के लिए संशोधित किया जा सकता है। उदाहरण के लिए, डिस्क्रिप्टर में traitItalic जोड़ें और उसी फ़ॉन्ट का इटैलिक संस्करण प्राप्त करें।
UIFont फ़ॉन्ट बनाने के लिए कई फ़ैक्टरी विधियाँ प्रदान करता है। systemFont(ofSize:) सिस्टम फ़ॉन्ट San Francisco (iOS) या Helvetica (पुराने संस्करण) लौटाता है। boldSystemFont, italicSystemFont — विशिष्ट शैलियों वाले वेरिएंट। preferredFont(forTextStyle:) दिए गए स्टाइल के लिए Dynamic Type फ़ॉन्ट लौटाता है: .headline, .body, .caption1, .footnote। सिस्टम में टेक्स्ट आकार सेटिंग बदलने पर ये फ़ॉन्ट स्वचालित रूप से स्केल हो जाते हैं।
कस्टम फ़ॉन्ट लोड करने के लिए, फ़ॉन्ट के PostScript नाम के साथ UIFont(name:size:) का उपयोग किया जाता है। फ़ॉन्ट को पहले Info.plist में जोड़ा जाना चाहिए और ऐप बंडल में शामिल किया जाना चाहिए। Apple के अनुसार, सभी मानक UI घटकों के लिए UIFont का उपयोग करने और केवल कस्टम रेंडरिंग की आवश्यकता होने पर CTFont पर स्विच करने की अनुशंसा की जाती है।
Dynamic Type iOS 7 में पेश की गई एक अनुकूली फ़ॉन्ट प्रणाली है। उपयोगकर्ता सेटिंग्स में अपना पसंदीदा टेक्स्ट आकार चुनता है — अतिरिक्त छोटे से अतिरिक्त बड़े तक। UIFont.preferredFont स्वचालित रूप से उपयुक्त आकार का फ़ॉन्ट लौटाता है। उचित संचालन के लिए, सभी UILabel में adjustsFontForContentSizeCategory = true होना चाहिए। Dynamic Type एक्सेसिबिलिटी अनुपालन के लिए आवश्यक है।
UIFontDescriptor खरोंच से एक नया इंस्टेंस बनाए बिना फ़ॉन्ट विशेषताओं को संशोधित करने की अनुमति देता है। विधियाँ addingAttributes(_:), withSymbolicTraits(_:), withFamily(_:) बदले हुए पैरामीटर के साथ एक नया डिस्क्रिप्टर लौटाती हैं। यह फ़ॉन्ट वेरिएंट प्राप्त करने के लिए सुविधाजनक है: PostScript नाम जाने बिना सिस्टम फ़ॉन्ट में traitBold जोड़ें और बोल्ड संस्करण प्राप्त करें।
CTFont (CTFontRef) निम्न-स्तरीय फ़ॉन्ट कार्य के लिए एक Core Text प्रकार है। यह CTFontCreateWithName, CTFontCreateWithFontDescriptor, CTFontCreateCopyWithAttributes द्वारा बनाया जाता है। प्रत्येक फ़ंक्शन निर्दिष्ट इंटरफ़ेस, आकार और वैकल्पिक विशेषताओं के साथ एक फ़ॉन्ट लौटाता है। CTFont का उपयोग drawRect के माध्यम से कस्टम UIView पर टेक्स्ट रेंडर करने के लिए Core Graphics में किया जाता है।
CTFont UIFont में उपलब्ध नहीं होने वाली मीट्रिक तक पहुँच प्रदान करता है: CTFontGetGlyphsForCharacters दिए गए वर्णों के लिए ग्लिफ़ की एक सरणी लौटाता है, CTFontGetAdvancesForGlyphs — प्रत्येक ग्लिफ़ की चौड़ाई, CTFontGetBoundingBox — ग्लिफ़ सीमाएँ। कस्टम टेक्स्ट लेआउट बनाने के लिए यह आवश्यक है: कॉलम, रोटेशन, रैपिंग।
CTFontGetAscent, CTFontGetDescent, CTFontGetLeading ऊर्ध्वाधर फ़ॉन्ट मीट्रिक लौटाते हैं। CTFontGetUnitsPerEm — प्रति em-वर्ग इकाइयों की संख्या, अनुपात गणना के लिए उपयोग किया जाता है। CTFontGetGlyphCount — फ़ॉन्ट में ग्लिफ़ की कुल संख्या। यह डेटा प्रिंट टाइपोग्राफी और कस्टम लेआउट के लिए महत्वपूर्ण है जहाँ प्रत्येक वर्ण की सटीक स्थिति की आवश्यकता होती है।
CTFont OpenType सुविधाओं का समर्थन करता है: CTFontCopyFeatures उपलब्ध फ़ॉन्ट फ़ंक्शन (लिगेचर, वैकल्पिक वर्ण, कर्निंग) का एक शब्दकोश लौटाता है, CTFontEnableFeature एक विशिष्ट विकल्प को सक्रिय करता है। वेरिएबल फ़ॉन्ट CTFontCopyVariation और CTFontCreateCopyWithVariation के माध्यम से कॉन्फ़िगर किए जाते हैं, जो निरंतर सीमा में weight, width और slant को बदलने की अनुमति देते हैं।
Swift में UIFont बनाना फ़ैक्टरी विधियों में से एक या नाम से सीधे आरंभीकरण के माध्यम से किया जाता है। सबसे आम तरीका सिस्टम फ़ॉन्ट के लिए systemFont(ofSize:weight:) या Dynamic Type के लिए preferredFont(forTextStyle:) है। कस्टम फ़ॉन्ट के लिए, PostScript नाम निर्दिष्ट करके UIFont(name:size:) का उपयोग किया जाता है।
UIFont.systemFont(ofSize:weight:) UIFont.Weight स्वीकार करता है — .ultraLight से .black तक। यह विधि संबंधित वज़न के साथ San Francisco सिस्टम फ़ॉन्ट लौटाती है। UIFont.monospacedSystemFont, UIFont.monospacedDigitSystemFont कोड और संख्याओं के लिए मोनोस्पेस फ़ॉन्ट लौटाते हैं। सभी सिस्टम फ़ॉन्ट स्वचालित रूप से Dynamic Type का समर्थन करते हैं।
let regularFont = UIFont.systemFont(ofSize: 16, weight: .regular)
let boldFont = UIFont.systemFont(ofSize: 16, weight: .bold)
let headlineFont = UIFont.preferredFont(forTextStyle: .headline)
let monoFont = UIFont.monospacedSystemFont(ofSize: 14, weight: .regular)
label.font = headlineFont
प्रत्येक फ़ॉन्ट को सीधे UILabel की font प्रॉपर्टी को असाइन किया जा सकता है या NSFontAttributeName के माध्यम से NSAttributedString में उपयोग किया जा सकता है। सिस्टम फ़ॉन्ट iOS द्वारा कैश किए जाते हैं, इसलिए सिस्टम फ़ॉन्ट को पुनः बनाने से कोई ओवरहेड नहीं होता।
कस्टम फ़ॉन्ट का उपयोग करने के लिए, प्रोजेक्ट बंडल में TTF या OTF फ़ाइल जोड़ें और इसे Info.plist (UIAppFonts) में निर्दिष्ट करें। फ़ॉन्ट का PostScript नाम UIFont.familyNames और UIFont.fontNames(forFamilyName:) के माध्यम से पाया जा सकता है। पंजीकरण के बाद, फ़ॉन्ट ऐप में कहीं से भी UIFont(name:size:) के माध्यम से उपलब्ध होता है।
// सभी फ़ॉन्ट परिवार नाम प्राप्त करें
for family in UIFont.familyNames {
let names = UIFont.fontNames(forFamilyName: family)
print("\(family): \(names)")
}
// कस्टम फ़ॉन्ट लोड करें
if let customFont = UIFont(name: "MyCustomFont-Regular", size: 18) {
label.font = customFont
}
यदि फ़ॉन्ट नाम गलत निर्दिष्ट किया गया है, तो UIFont(name:size:) nil लौटाता है। यह सुनिश्चित करने के लिए डीबगिंग के दौरान UIFont.familyNames और UIFont.fontNames(forFamilyName:) के माध्यम से सभी उपलब्ध फ़ॉन्ट नाम प्रिंट करने की अनुशंसा की जाती है कि फ़ॉन्ट सही ढंग से पंजीकृत है।
कस्टम फ़ॉन्ट लोड करना दो तरीकों से संभव है: Info.plist (UIAppFonts) के माध्यम से स्थिर पंजीकरण और CTFontManagerRegisterGraphicsFont के माध्यम से गतिशील पंजीकरण। पहली विधि सरल है — फ़ॉन्ट ऐप लॉन्च होने के तुरंत बाद उपलब्ध होता है। दूसरी का उपयोग नेटवर्क से डाउनलोड किए गए या ऑन-डिमांड संसाधनों के लिए किया जाता है।
गतिशील पंजीकरण ऑन-डिमांड संसाधनों के लिए उपयोगी है: यदि ऐप में 20+ फ़ॉन्ट हैं, तो उन सभी को प्रारंभिक बंडल से बाहर रखा जा सकता है और पहले उपयोग पर डाउनलोड किया जा सकता है। CTFontManagerRegisterFontsForURLs निर्दिष्ट URL से फ़ॉन्ट पंजीकृत करता है। पंजीकरण के बाद, फ़ॉन्ट हमेशा की तरह UIFont(name:size:) के माध्यम से उपलब्ध हो जाता है।
Core Text के माध्यम से कस्टम रेंडरिंग के लिए, फ़ॉन्ट के PostScript नाम के साथ CTFontCreateWithName का उपयोग करें। UIFont से अंतर यह है कि CTFont को परिवर्तन मैट्रिक्स (CTFontCreateWithNameAndOptions) के साथ बनाया जा सकता है — तिरछे फ़ॉन्ट बनाने के लिए: झुकाव, X-अक्ष स्केलिंग, रोटेशन। यह affine ट्रांसफ़ॉर्म का उपयोग किए बिना UIFont में उपलब्ध नहीं है।
// तिरछा मैट्रिक्स के साथ CTFont बनाएँ
var matrix = CGAffineTransform(a: 1, b: 0, c: 0.2, d: 1, tx: 0, ty: 0)
let ctFont = CTFontCreateWithName(
"Helvetica" as CFString,
24, &matrix)
// UIFont के साथ toll-free bridging का उपयोग करें
let uiFont = ctFont as UIFont
label.font = uiFont
परिवर्तन मैट्रिक्स एक अलग फ़ॉन्ट फ़ाइल के बिना इटैलिक वेरिएंट बनाने की अनुमति देता है। पैरामीटर c (skew) वर्णों में झुकाव जोड़ता है। मैट्रिक्स फ़ॉन्ट को क्षैतिज रूप से स्केल करने की भी अनुमति देता है — एक फ़ॉन्ट के संघनित या विस्तारित वेरिएंट बनाना।
UIFont और CTFont के बीच मुख्य अंतर एब्स्ट्रैक्शन का स्तर है। UIFont सामान्य कार्यों के लिए एक सरल API प्रदान करता है: सिस्टम फ़ॉन्ट प्राप्त करें, आकार बदलें, UILabel पर लागू करें। CTFont फ़ॉन्ट पर पूर्ण नियंत्रण प्रदान करता है: ग्लिफ़, मीट्रिक, OpenType तालिकाओं और वेरिएबल अक्षों तक पहुँच। चुनाव कार्य पर निर्भर करता है।
| विशेषता | UIFont | CTFont |
|---|---|---|
| फ्रेमवर्क | UIKit | Core Text |
| निर्माण | systemFont / preferredFont / initWithName | CTFontCreateWithName / CTFontCreateWithDescriptor |
| ग्लिफ़ पहुँच | नहीं | CTFontGetGlyphsForCharacters |
| OpenType सुविधाएँ | सीमित (UIFontDescriptor) | पूर्ण पहुँच |
| वेरिएबल फ़ॉन्ट | UIFontDescriptor के माध्यम से | CTFontCopyVariation / CreateCopyWithVariation |
| रेंडरिंग | UI घटकों में स्वचालित | Core Graphics, कस्टम |
95% iOS डेवलपमेंट कार्यों के लिए, UIFont पर्याप्त है। Core Text के साथ CTFont टेक्स्ट एडिटर, PDF जनरेटर, टाइपोग्राफ़िक लेआउट वाली पुस्तकें या दुर्लभ भाषाओं के कस्टम रेंडरिंग वाले ऐप बनाते समय उचित है।
iOS में फ़ॉन्ट के साथ काम करने के लिए प्रदर्शन पर विचार करना आवश्यक है। प्रत्येक अद्वितीय फ़ॉन्ट पहली पहुँच पर मेमोरी में लोड होता है और संसाधनों का उपभोग करता है। San Francisco सिस्टम फ़ॉन्ट पहले से लोड होते हैं और कोई ओवरहेड नहीं बनाते। कस्टम फ़ॉन्ट फ़ाइल से लोड होते हैं और पहले लोड के बाद सिस्टम द्वारा कैश किए जाते हैं।
एक ऐप में अद्वितीय फ़ॉन्ट की संख्या को 3-5 परिवारों तक सीमित करने की अनुशंसा की जाती है। प्रत्येक फ़ॉन्ट मेमोरी में 50 KB से 2 MB तक लेता है। एक ही परिवार के विभिन्न वज़न (regular, bold, medium) का उपयोग करना कई अलग-अलग परिवारों को लोड करने की तुलना में अधिक कुशल है।
सिस्टम बनाए गए UIFont इंस्टेंस को कैश करता है, इसलिए UIFont.systemFont(ofSize: 16, weight: .regular) के बार-बार कॉल एक नया ऑब्जेक्ट नहीं बनाते। हालाँकि, कस्टम फ़ॉन्ट के लिए UIFont(name:size:) हमेशा कैश नहीं किया जाता — फ़ाइल से पुनः लोड करने से बचने के लिए बार-बार उपयोग किए जाने वाले फ़ॉन्ट को स्थिर गुणों या NSCache में संग्रहीत करने की अनुशंसा की जाती है।
CTFontManagerRegisterGraphicsFont के माध्यम से गतिशील रूप से फ़ॉन्ट पंजीकृत करते समय, यदि फ़ॉन्ट फ़ाइल नेटवर्क से डाउनलोड की जाती है तो प्रक्रिया अतुल्यकालिक हो सकती है। इस मामले में, UILabel या UITextView को लोडिंग पूरी होने तक एक फ़ॉलबैक सिस्टम फ़ॉन्ट प्रदर्शित करना चाहिए। पंजीकरण के बाद, फ़ॉन्ट उपलब्ध हो जाता है और स्क्रीन स्वचालित रूप से टेक्स्ट डिस्प्ले को अपडेट करती है।
अक्सर पूछे जाने वाले प्रश्न
हाँ, UIFont और CTFont toll-free bridging का समर्थन करते हैं। रूपांतरण सरल कास्टिंग द्वारा किया जाता है: UIFont as CTFont या CTFont as UIFont। कोई ओवरहेड या डेटा कॉपी नहीं होती — दोनों क्लास मेमोरी में एक ही फ़ॉन्ट ऑब्जेक्ट को इंगित करते हैं।
सभी UI घटकों के लिए, UIFont का उपयोग करें। यह UIKit के लिए अनुकूलित है, Dynamic Type का समर्थन करता है, और सिस्टम सेटिंग बदलने पर सही ढंग से स्केल होता है। CTFont केवल Core Graphics के माध्यम से कस्टम रेंडरिंग या निम्न-स्तरीय फ़ॉन्ट मीट्रिक पहुँच की आवश्यकता होने पर उचित है।
परिवारों की सूची के लिए UIFont.familyNames और PostScript नामों के लिए UIFont.fontNames(forFamilyName:) का उपयोग करें। डीबग मोड में इस कोड को कॉल करें और वांछित फ़ॉन्ट ढूँढें। PostScript नाम में आमतौर पर परिवार का नाम और शैली होती है: “SFProText-Regular”, “HelveticaNeue-Bold”।
हाँ, UIFontDescriptor के माध्यम से आप वेरिएबल अक्षों को कॉन्फ़िगर कर सकते हैं: weight, width, slant। हालाँकि, वेरिएबल फ़ॉन्ट के लिए UIFont API CTFontCopyVariation की तुलना में सीमित है। वेरिएबल अक्षों पर पूर्ण नियंत्रण के लिए, Core Text और CTFontCreateCopyWithVariation का उपयोग करें।
नाम और आकार के संयोजन से कुंजी के साथ एक स्थिर शब्दकोश या NSCache बनाएँ। सिस्टम फ़ॉन्ट के लिए, iOS स्वचालित रूप से इंस्टेंस कैश करता है, लेकिन UIFont(name:size:) के माध्यम से बनाए गए कस्टम फ़ॉन्ट के लिए, TTF फ़ाइल से पुनः लोड करने से बचने के लिए ऑब्जेक्ट को ऐप कैश में संग्रहीत करने की अनुशंसा की जाती है।
सारांश
हम एक मोबाइल एप्लिकेशन टर्नकी विकसित करेंगे
IT Sectr 2017 से स्टार्टअप और व्यवसायों के लिए iOS और Android एप्लिकेशन बनाता है। हम आपको सलाह देंगे और सर्वोत्तम समाधान प्रस्तावित करेंगे।
यह भी पढ़ें