UIFont / CTFont — यह क्या है, फ़ॉन्ट प्रकार और Core Text

लेखक: IT Sectr प्रकाशित: 2026-07-23 पढ़ने का समय: 9 मिनट

UIFont और CTFont iOS में फ़ॉन्ट के साथ काम करने के लिए क्लास हैं: UILabel और UITextView में उच्च-स्तरीय टेक्स्ट कॉन्फ़िगरेशन के लिए UIKit से UIFont, ग्लिफ़ और मीट्रिक पर पूर्ण नियंत्रण के साथ निम्न-स्तरीय रेंडरिंग के लिए Core Text से CTFont। Apple Developer Documentation के अनुसार, UIFont का उपयोग 90% मानक UI घटकों में किया जाता है, जबकि CTFont का उपयोग कस्टम टेक्स्ट इंजन और संपादकों में किया जाता है। दोनों क्लास एक ही फ़ॉन्ट को दर्शाते हैं लेकिन अलग-अलग स्तर के एब्स्ट्रैक्शन पर।

मुख्य बातें

  • UIFont — UI घटकों में फ़ॉन्ट के साथ काम करने के लिए उच्च-स्तरीय UIKit क्लास
  • CTFont — टाइपोग्राफी पर सटीक नियंत्रण के लिए निम्न-स्तरीय Core Text क्लास
  • UIFont systemFont, preferredFont या initWithName के माध्यम से बनाया जाता है, CTFont — CTFontCreateWithName के माध्यम से
  • Dynamic Type — iOS अनुकूली फ़ॉन्ट सिस्टम जो एक्सेसिबिलिटी सेटिंग्स पर स्वचालित रूप से प्रतिक्रिया करता है
  • CTFont ग्लिफ़ मीट्रिक, कर्निंग और OpenType टेबल तक सीधी पहुँच प्रदान करता है

UIFont और CTFont क्या हैं?

UIFont एक UIKit क्लास है जो UI घटकों में टेक्स्ट प्रदर्शित करने के लिए फ़ॉन्ट का प्रतिनिधित्व करता है: UILabel, UITextView, UITextField। यह निर्दिष्ट आकार, वज़न और शैली के साथ सिस्टम और कस्टम फ़ॉन्ट प्राप्त करने के लिए एक सरल इंटरफ़ेस प्रदान करता है। UIFont कर्निंग, लिगेचर और OpenType सुविधाओं पर सीधा नियंत्रण नहीं देता — इसके लिए Core Text का उपयोग किया जाता है।

CTFont एक Core Text प्रकार (CTFontRef) है जो फ़ॉन्ट डेटा तक निम्न-स्तरीय पहुँच प्रदान करता है। CTFont रेंडरिंग के लिए सीधे Core Graphics के साथ काम करता है, वैकल्पिक ग्लिफ़, लिगेचर और वेरिएबल फ़ॉन्ट सहित सभी OpenType और TrueType सुविधाओं का समर्थन करता है। CTFont आंतरिक रूप से UIFont को रेंडर करने के लिए UIKit द्वारा उपयोग किया जाता है लेकिन कस्टम ड्रॉइंग के लिए सीधे भी उपलब्ध है।

Toll-Free Bridging

UIFont और CTFont toll-free bridging का समर्थन करते हैं — बिना किसी अतिरिक्त लागत के प्रकारों के बीच रूपांतरण। Swift और Objective-C में UIFont को CTFont या CTFont को UIFont के रूप में कास्ट करना संभव है। यह कॉन्फ़िगरेशन के लिए उच्च-स्तरीय UIKit API और फ़ॉन्ट डेटा की प्रतिलिपि बनाए बिना रेंडरिंग के लिए निम्न-स्तरीय Core Text का उपयोग करने की अनुमति देता है।

फ़ॉन्ट डिस्क्रिप्टर

दोनों क्लास फ़ॉन्ट विशेषताओं का वर्णन करने के लिए UIFontDescriptor (UIKit) / CTFontDescriptor (Core Text) का उपयोग करते हैं: नाम, आकार, वज़न, शैली, परिवर्तन मैट्रिक्स। डिस्क्रिप्टर विशेषताओं का एक शब्दकोश है जिसे मौजूदा फ़ॉन्ट के आधार पर नए फ़ॉन्ट बनाने के लिए संशोधित किया जा सकता है। उदाहरण के लिए, डिस्क्रिप्टर में traitItalic जोड़ें और उसी फ़ॉन्ट का इटैलिक संस्करण प्राप्त करें।

UIFont — UIKit फ़ॉन्ट

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

Dynamic Type iOS 7 में पेश की गई एक अनुकूली फ़ॉन्ट प्रणाली है। उपयोगकर्ता सेटिंग्स में अपना पसंदीदा टेक्स्ट आकार चुनता है — अतिरिक्त छोटे से अतिरिक्त बड़े तक। UIFont.preferredFont स्वचालित रूप से उपयुक्त आकार का फ़ॉन्ट लौटाता है। उचित संचालन के लिए, सभी UILabel में adjustsFontForContentSizeCategory = true होना चाहिए। Dynamic Type एक्सेसिबिलिटी अनुपालन के लिए आवश्यक है।

UIFontDescriptor

UIFontDescriptor खरोंच से एक नया इंस्टेंस बनाए बिना फ़ॉन्ट विशेषताओं को संशोधित करने की अनुमति देता है। विधियाँ addingAttributes(_:), withSymbolicTraits(_:), withFamily(_:) बदले हुए पैरामीटर के साथ एक नया डिस्क्रिप्टर लौटाती हैं। यह फ़ॉन्ट वेरिएंट प्राप्त करने के लिए सुविधाजनक है: PostScript नाम जाने बिना सिस्टम फ़ॉन्ट में traitBold जोड़ें और बोल्ड संस्करण प्राप्त करें।

CTFont — Core Text फ़ॉन्ट

CTFont (CTFontRef) निम्न-स्तरीय फ़ॉन्ट कार्य के लिए एक Core Text प्रकार है। यह CTFontCreateWithName, CTFontCreateWithFontDescriptor, CTFontCreateCopyWithAttributes द्वारा बनाया जाता है। प्रत्येक फ़ंक्शन निर्दिष्ट इंटरफ़ेस, आकार और वैकल्पिक विशेषताओं के साथ एक फ़ॉन्ट लौटाता है। CTFont का उपयोग drawRect के माध्यम से कस्टम UIView पर टेक्स्ट रेंडर करने के लिए Core Graphics में किया जाता है।

CTFont UIFont में उपलब्ध नहीं होने वाली मीट्रिक तक पहुँच प्रदान करता है: CTFontGetGlyphsForCharacters दिए गए वर्णों के लिए ग्लिफ़ की एक सरणी लौटाता है, CTFontGetAdvancesForGlyphs — प्रत्येक ग्लिफ़ की चौड़ाई, CTFontGetBoundingBox — ग्लिफ़ सीमाएँ। कस्टम टेक्स्ट लेआउट बनाने के लिए यह आवश्यक है: कॉलम, रोटेशन, रैपिंग।

फ़ॉन्ट मीट्रिक

CTFontGetAscent, CTFontGetDescent, CTFontGetLeading ऊर्ध्वाधर फ़ॉन्ट मीट्रिक लौटाते हैं। CTFontGetUnitsPerEm — प्रति em-वर्ग इकाइयों की संख्या, अनुपात गणना के लिए उपयोग किया जाता है। CTFontGetGlyphCount — फ़ॉन्ट में ग्लिफ़ की कुल संख्या। यह डेटा प्रिंट टाइपोग्राफी और कस्टम लेआउट के लिए महत्वपूर्ण है जहाँ प्रत्येक वर्ण की सटीक स्थिति की आवश्यकता होती है।

OpenType और वेरिएबल फ़ॉन्ट

CTFont OpenType सुविधाओं का समर्थन करता है: CTFontCopyFeatures उपलब्ध फ़ॉन्ट फ़ंक्शन (लिगेचर, वैकल्पिक वर्ण, कर्निंग) का एक शब्दकोश लौटाता है, CTFontEnableFeature एक विशिष्ट विकल्प को सक्रिय करता है। वेरिएबल फ़ॉन्ट CTFontCopyVariation और CTFontCreateCopyWithVariation के माध्यम से कॉन्फ़िगर किए जाते हैं, जो निरंतर सीमा में weight, width और slant को बदलने की अनुमति देते हैं।

कोड में UIFont का उपयोग कैसे करें

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 का समर्थन करते हैं।

swift
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:) के माध्यम से उपलब्ध होता है।

swift
// सभी फ़ॉन्ट परिवार नाम प्राप्त करें
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:) के माध्यम से सभी उपलब्ध फ़ॉन्ट नाम प्रिंट करने की अनुशंसा की जाती है कि फ़ॉन्ट सही ढंग से पंजीकृत है।

UIFont और CTFont के साथ कस्टम फ़ॉन्ट

कस्टम फ़ॉन्ट लोड करना दो तरीकों से संभव है: Info.plist (UIAppFonts) के माध्यम से स्थिर पंजीकरण और CTFontManagerRegisterGraphicsFont के माध्यम से गतिशील पंजीकरण। पहली विधि सरल है — फ़ॉन्ट ऐप लॉन्च होने के तुरंत बाद उपलब्ध होता है। दूसरी का उपयोग नेटवर्क से डाउनलोड किए गए या ऑन-डिमांड संसाधनों के लिए किया जाता है।

गतिशील पंजीकरण ऑन-डिमांड संसाधनों के लिए उपयोगी है: यदि ऐप में 20+ फ़ॉन्ट हैं, तो उन सभी को प्रारंभिक बंडल से बाहर रखा जा सकता है और पहले उपयोग पर डाउनलोड किया जा सकता है। CTFontManagerRegisterFontsForURLs निर्दिष्ट URL से फ़ॉन्ट पंजीकृत करता है। पंजीकरण के बाद, फ़ॉन्ट हमेशा की तरह UIFont(name:size:) के माध्यम से उपलब्ध हो जाता है।

कस्टम फ़ॉन्ट के लिए CTFontCreateWithName

Core Text के माध्यम से कस्टम रेंडरिंग के लिए, फ़ॉन्ट के PostScript नाम के साथ CTFontCreateWithName का उपयोग करें। UIFont से अंतर यह है कि CTFont को परिवर्तन मैट्रिक्स (CTFontCreateWithNameAndOptions) के साथ बनाया जा सकता है — तिरछे फ़ॉन्ट बनाने के लिए: झुकाव, X-अक्ष स्केलिंग, रोटेशन। यह affine ट्रांसफ़ॉर्म का उपयोग किए बिना UIFont में उपलब्ध नहीं है।

swift
// तिरछा मैट्रिक्स के साथ 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 और CTFont के बीच मुख्य अंतर एब्स्ट्रैक्शन का स्तर है। UIFont सामान्य कार्यों के लिए एक सरल API प्रदान करता है: सिस्टम फ़ॉन्ट प्राप्त करें, आकार बदलें, UILabel पर लागू करें। CTFont फ़ॉन्ट पर पूर्ण नियंत्रण प्रदान करता है: ग्लिफ़, मीट्रिक, OpenType तालिकाओं और वेरिएबल अक्षों तक पहुँच। चुनाव कार्य पर निर्भर करता है।

विशेषताUIFontCTFont
फ्रेमवर्कUIKitCore Text
निर्माणsystemFont / preferredFont / initWithNameCTFontCreateWithName / 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 इंस्टेंस को कैश करता है, इसलिए UIFont.systemFont(ofSize: 16, weight: .regular) के बार-बार कॉल एक नया ऑब्जेक्ट नहीं बनाते। हालाँकि, कस्टम फ़ॉन्ट के लिए UIFont(name:size:) हमेशा कैश नहीं किया जाता — फ़ाइल से पुनः लोड करने से बचने के लिए बार-बार उपयोग किए जाने वाले फ़ॉन्ट को स्थिर गुणों या NSCache में संग्रहीत करने की अनुशंसा की जाती है।

अतुल्यकालिक फ़ॉन्ट लोडिंग

CTFontManagerRegisterGraphicsFont के माध्यम से गतिशील रूप से फ़ॉन्ट पंजीकृत करते समय, यदि फ़ॉन्ट फ़ाइल नेटवर्क से डाउनलोड की जाती है तो प्रक्रिया अतुल्यकालिक हो सकती है। इस मामले में, UILabel या UITextView को लोडिंग पूरी होने तक एक फ़ॉलबैक सिस्टम फ़ॉन्ट प्रदर्शित करना चाहिए। पंजीकरण के बाद, फ़ॉन्ट उपलब्ध हो जाता है और स्क्रीन स्वचालित रूप से टेक्स्ट डिस्प्ले को अपडेट करती है।

अक्सर पूछे जाने वाले प्रश्न

क्या UIFont को CTFont और वापस परिवर्तित किया जा सकता है?

हाँ, UIFont और CTFont toll-free bridging का समर्थन करते हैं। रूपांतरण सरल कास्टिंग द्वारा किया जाता है: UIFont as CTFont या CTFont as UIFont। कोई ओवरहेड या डेटा कॉपी नहीं होती — दोनों क्लास मेमोरी में एक ही फ़ॉन्ट ऑब्जेक्ट को इंगित करते हैं।

UIKit में उपयोग के लिए कौन सा पसंदीदा है?

सभी UI घटकों के लिए, UIFont का उपयोग करें। यह UIKit के लिए अनुकूलित है, Dynamic Type का समर्थन करता है, और सिस्टम सेटिंग बदलने पर सही ढंग से स्केल होता है। CTFont केवल Core Graphics के माध्यम से कस्टम रेंडरिंग या निम्न-स्तरीय फ़ॉन्ट मीट्रिक पहुँच की आवश्यकता होने पर उचित है।

UIFont(name:size:) के लिए फ़ॉन्ट नाम कैसे पता करें?

परिवारों की सूची के लिए UIFont.familyNames और PostScript नामों के लिए UIFont.fontNames(forFamilyName:) का उपयोग करें। डीबग मोड में इस कोड को कॉल करें और वांछित फ़ॉन्ट ढूँढें। PostScript नाम में आमतौर पर परिवार का नाम और शैली होती है: “SFProText-Regular”, “HelveticaNeue-Bold”।

क्या UIFont वेरिएबल फ़ॉन्ट का समर्थन करता है?

हाँ, UIFontDescriptor के माध्यम से आप वेरिएबल अक्षों को कॉन्फ़िगर कर सकते हैं: weight, width, slant। हालाँकि, वेरिएबल फ़ॉन्ट के लिए UIFont API CTFontCopyVariation की तुलना में सीमित है। वेरिएबल अक्षों पर पूर्ण नियंत्रण के लिए, Core Text और CTFontCreateCopyWithVariation का उपयोग करें।

UIFont को सही तरीके से कैसे कैश करें?

नाम और आकार के संयोजन से कुंजी के साथ एक स्थिर शब्दकोश या NSCache बनाएँ। सिस्टम फ़ॉन्ट के लिए, iOS स्वचालित रूप से इंस्टेंस कैश करता है, लेकिन UIFont(name:size:) के माध्यम से बनाए गए कस्टम फ़ॉन्ट के लिए, TTF फ़ाइल से पुनः लोड करने से बचने के लिए ऑब्जेक्ट को ऐप कैश में संग्रहीत करने की अनुशंसा की जाती है।

सारांश

  • UIFont — Dynamic Type के साथ UI घटकों में फ़ॉन्ट के लिए उच्च-स्तरीय UIKit क्लास
  • CTFont — रेंडरिंग और ग्लिफ़ पहुँच के लिए निम्न-स्तरीय Core Text प्रकार
  • UIFont systemFont, preferredFont या UIFont(name:size:) के माध्यम से बनाया जाता है
  • CTFont CTFontCreateWithName या CTFontCreateWithDescriptor के माध्यम से बनाया जाता है
  • Toll-free bridging UIFont और CTFont के बीच मुफ्त रूपांतरण की अनुमति देता है
  • Dynamic Type एक्सेसिबिलिटी के लिए आवश्यक है: preferredFont और adjustsFontForContentSizeCategory का उपयोग करें
  • UIKit के लिए UIFont का उपयोग करें, कस्टम रेंडरिंग के लिए CTFont का उपयोग करें

हम एक मोबाइल एप्लिकेशन टर्नकी विकसित करेंगे

IT Sectr 2017 से स्टार्टअप और व्यवसायों के लिए iOS और Android एप्लिकेशन बनाता है। हम आपको सलाह देंगे और सर्वोत्तम समाधान प्रस्तावित करेंगे।

परियोजना पर चर्चा करें

यह भी पढ़ें