Font Descriptor iOS में UIFontDescriptor और macOS में NSFontDescriptor ऑब्जेक्ट है जो सभी फ़ॉन्ट मेटाडेटा को समाहित करता है: परिवार, टाइपफ़ेस, आकार, अक्षर अंतर, पंक्ति अंतर और टाइपोग्राफ़िक विशेषताएँ। सीधे UIFont(name:size:) के माध्यम से फ़ॉन्ट बनाने के बजाय, डेवलपर डिस्क्रिप्टर के माध्यम से वांछित विशेषताओं का वर्णन करता है, और सिस्टम उपलब्ध फ़ॉन्ट में से सर्वश्रेष्ठ मिलान चुनता है। Apple डेवलपर दस्तावेज़ीकरण के अनुसार, UIFontDescriptor 20 से अधिक फ़ॉन्ट विशेषताओं का समर्थन करता है और सभी iOS टाइपोग्राफ़ी फ्रेमवर्क — UIKit से Core Text और SwiftUI तक — में उपयोग किया जाता है।
मुख्य बिंदु
Font Descriptor एक ऑब्जेक्ट है जो किसी विशिष्ट फ़ॉन्ट फ़ाइल के बजाय कुंजी-मान जोड़े के सेट के रूप में फ़ॉन्ट विशेषताओं का वर्णन करता है। नाम से फ़ॉन्ट बनाने के बजाय, डेवलपर परिवार, टाइपफ़ेस, आकार और वैकल्पिक विशेषताएँ निर्दिष्ट करता है, और सिस्टम सर्वश्रेष्ठ मिलान चुनता है। यह दृष्टिकोण अनुकूली टाइपोग्राफ़ी के लिए महत्वपूर्ण है: एक ही डिस्क्रिप्टर विभिन्न iOS संस्करणों में काम कर सकता है जहाँ उपलब्ध फ़ॉन्ट का सेट भिन्न होता है। iOS मानव इंटरफ़ेस दिशानिर्देशों के अनुसार, डिस्क्रिप्टर के माध्यम से फ़ॉन्ट मिलान गतिशील फ़ॉन्ट के साथ काम करने का अनुशंसित तरीका है।
Font Descriptor के बिना, डेवलपर्स को प्रत्येक फ़ॉन्ट की उपलब्धता नाम से जाँचनी होती और मैन्युअल रूप से फ़ॉलबैक विकल्प परिभाषित करने होते। डिस्क्रिप्टर इस प्रक्रिया को स्वचालित करता है: इसमें टाइपफ़ेस की संगतता मैट्रिक्स — सामान्य, बोल्ड, इटैलिक, बोल्ड इटैलिक — होती है और जब सटीक मिलान नहीं मिलता, तो यह निकटतम उपलब्ध मिलान लौटाता है। सिस्टम मिलान Core Text स्तर पर काम करता है और एकीकृत NSFontDescriptor API के माध्यम से iOS और macOS दोनों पर उपलब्ध है।
डिस्क्रिप्टर कस्टम फ़ॉन्ट — Info.plist के माध्यम से लोड किए गए या मैन्युअल रूप से जोड़े गए — के लिए भी उपयोग किए जाते हैं। यदि कोई फ़ॉन्ट सिस्टम में पंजीकृत है, तो उसका डिस्क्रिप्टर बिल्कुल सिस्टम फ़ॉन्ट की तरह ही बनाया जाता है। क्रॉस-प्लेटफ़ॉर्म नोट: डिस्क्रिप्टर की अवधारणा Android में Typeface.Builder के माध्यम से भी मौजूद है, लेकिन iOS कार्यान्वयन UIFontDescriptor के माध्यम से काफी अधिक विशेषताएँ प्रदान करता है — Android में 5 की तुलना में 20 से अधिक।
UIFontDescriptor में [UIFontDescriptor.AttributeName: Any] प्रकार के fontAttributes शब्दकोश में समूहित विशेषताएँ होती हैं। मुख्य विशेषताओं में फ़ॉन्ट परिवार, नाम, आकार, विशेषताएँ (traits), रूपांतरण मैट्रिक्स, ऑप्टिकल आकार और टेक्स्ट शैली शामिल हैं। Apple WWDC 2019 सत्र 227 के अनुसार, टेक्स्ट शैलियों — Dynamic Type — का उपयोग पहुँच-योग्यता-संगत अनुप्रयोगों के लिए अनिवार्य है।
traits विशेषता एक शब्दकोश है जिसमें प्रतीकात्मक विशेषताएँ होती हैं: वज़न (UIFontWeightTrait), तिरछापन (UIFontSlantTrait), चौड़ाई (UIFontWidthTrait) और अन्य। इन मानों का उपयोग फ़ॉन्ट मिलानकर्ता टाइपफ़ेस चुनने के लिए करता है। उदाहरण के लिए, UIFontWeightTrait मान 0.0 — सामान्य टाइपफ़ेस, 0.3 — बोल्ड। सिस्टम स्वचालित रूप से संख्यात्मक मानों को उपलब्ध फ़ॉन्ट वेरिएंट में मैप करता है।
अतिरिक्त विशेषताओं में OpenType सुविधाओं के लिए featureSettings (लिगेचर, कर्निंग, अंक अनुपात), उपयोगकर्ता को प्रदर्शन के लिए visibleName, फ़ॉन्ट के एफ़िन रूपांतरण के लिए matrix और कैस्केडिंग फ़ॉलबैक फ़ॉन्ट सूचियों के लिए cascadeList शामिल हैं। विशेषताओं की पूरी सूची iOS और macOS में लगभग सभी टाइपोग्राफ़ी परिदृश्यों को कवर करती है।
| विशेषता | प्रकार | विवरण |
|---|---|---|
| UIFontDescriptorFamily | String | फ़ॉन्ट परिवार (SF Pro, Helvetica Neue) |
| UIFontDescriptorName | String | पूरा फ़ॉन्ट नाम (HelveticaNeue-Bold) |
| UIFontDescriptorSize | NSNumber | पॉइंट में फ़ॉन्ट आकार |
| UIFontDescriptorMatrix | NSValue | एफ़िन रूपांतरण मैट्रिक्स |
| UIFontDescriptorTraits | [String: Any] | टाइपफ़ेस की प्रतीकात्मक विशेषताएँ |
| UIFontDescriptorTextStyle | String | Dynamic Type शैली (headline, body, caption) |
iOS में Font Descriptor के साथ काम करने का प्राथमिक तरीका डिस्क्रिप्टर बनाना और फिर उससे UIFont उत्पन्न करना है। यह पसंदीदा दृष्टिकोण है जब आपको सटीक नाम जाने बिना विशिष्ट विशेषताओं वाले फ़ॉन्ट की आवश्यकता हो। प्रक्रिया में दो चरण होते हैं: इनिशियलाइज़र के माध्यम से UIFontDescriptor बनाना और डिस्क्रिप्टर पर font(withSize:) विधि कॉल करना।
import UIKit
// परिवार के लिए फ़ॉन्ट डिस्क्रिप्टर बनाएँ
let descriptor = UIFontDescriptor.init(
fontAttributes: [
.family: "SF Pro",
.traits: [
.weight: UIFont.Weight.bold
]
]
)
// डिस्क्रिप्टर से UIFont उत्पन्न करें
let font = descriptor.font(withSize: 17)
यह दृष्टिकोण सुनिश्चित करता है कि सिस्टम वर्तमान डिवाइस पर SF Pro के बोल्ड टाइपफ़ेस के लिए सर्वश्रेष्ठ मिलान चुने। मुख्य लाभ — कोड iOS संस्करण पर निर्भर नहीं करता: iOS 13 पर SF Pro उपयोग किया जाएगा; पुराने संस्करणों पर Helvetica Neue या डिफ़ॉल्ट सिस्टम फ़ॉन्ट।
गतिशील आकार वाला फ़ॉन्ट बनाने के लिए, टेक्स्ट शैली और स्केल के साथ इनिशियलाइज़र का उपयोग करें। Dynamic Type उपयोगकर्ता की सेटिंग्स के अनुसार स्वचालित रूप से आकार समायोजित करता है:
// Dynamic Type डिस्क्रिप्टर
let bodyDescriptor = UIFontDescriptor
.preferredFontDescriptor(withTextStyle: .body)
// फ़ॉन्ट बोल्ड बनाएँ
let boldDescriptor = bodyDescriptor.withSymbolicTraits([.traitBold])
// गतिशील आकार संरक्षित करते हुए UIFont उत्पन्न करें
let boldBodyFont = UIFont(
descriptor: boldDescriptor!,
size: bodyDescriptor.pointSize
)
महत्वपूर्ण: withSymbolicTraits विधि एक वैकल्पिक डिस्क्रिप्टर लौटाती है — यदि अनुरोधित टाइपफ़ेस अनुपलब्ध है, तो यह nil लौटाती है। उपयोग से पहले हमेशा वैकल्पिक की जाँच करें।
Font Descriptor एक अपरिवर्तनीय मॉडल का समर्थन करता है — प्रत्येक संशोधन विधि बदली गई विशेषता के साथ एक नया डिस्क्रिप्टर लौटाती है। यह मूल्य शब्दार्थ का पालन करता है और कोड को पूर्वानुमानित बनाता है: मूल डिस्क्रिप्टर कभी नहीं बदलता। मुख्य संशोधन विधियाँ हैं: विशेषताएँ जोड़ने के लिए addingAttributes, टाइपफ़ेस बदलने के लिए withFace, आकार बदलने के लिए withSize और एफ़िन रूपांतरण के लिए withMatrix।
addingAttributes विधि सबसे लचीली है। यह विशेषताओं का शब्दकोश लेती है और एक नया डिस्क्रिप्टर लौटाती है। जब कुंजियाँ मेल खाती हैं, तो नए मान पुराने को बदल देते हैं। यह एक ही कॉल में वज़न जोड़ने, आकार बदलने और लिगेचर सक्षम करने जैसे बदलावों को संयोजित करने की अनुमति देता है। Apple तकनीकी प्रश्नोत्तर QA1682 के अनुसार, addingAttributes एक्सटेंशन के माध्यम से बल्क संशोधन का अनुशंसित तरीका है।
व्यावहारिक उपयोग मामला: कोड संपादक में मोनोस्पेस्ड टेक्स्ट के लिए फ़ॉन्ट बनाना। डेवलपर सिस्टम मोनोस्पेस्ड डिस्क्रिप्टर लेता है, पतली रेखाओं के लिए कम वज़न जोड़ता है और featureSettings के माध्यम से अक्षर अंतर बढ़ाता है। यह अलग फ़ॉन्ट लोड किए बिना अधिक पठनीय कोड प्रदान करता है।
let monoDescriptor = UIFontDescriptor.monospacedDigitFontDescriptor()
// कस्टम विशेषताएँ जोड़ें
let customDescriptor = monoDescriptor.addingAttributes([
.size: 14,
.traits: [
.weight: UIFont.Weight.medium
]
])
let monoFont = UIFont(
descriptor: customDescriptor,
size: 14
)
सीमा: डिस्क्रिप्टर बनाने के बाद सभी विशेषताओं को नहीं बदला जा सकता। उदाहरण के लिए, फ़ॉन्ट परिवार इनिशियलाइज़ेशन के दौरान एक बार सेट किया जाता है। यदि आपको परिवार बदलने की आवश्यकता है, तो एक नया डिस्क्रिप्टर बनाएँ। यह Core Text आर्किटेक्चर से संबंधित है, जहाँ डिस्क्रिप्टर एक विशिष्ट फ़ॉन्ट संसाधन से बंधा होता है।
फ़ॉन्ट मिलान Font Descriptor की एक मुख्य विशेषता है जो स्थापित फ़ॉन्ट में से अनुरोधित विशेषताओं के लिए स्वचालित रूप से सर्वश्रेष्ठ मिलान चुनती है। प्रक्रिया में तीन चरण शामिल हैं: फ़िल्टरिंग (असंगत फ़ॉन्ट को बाहर करना), रैंकिंग (मिलान की डिग्री के अनुसार क्रमबद्ध करना), और चयन (सर्वश्रेष्ठ परिणाम लौटाना)। मिलान Core Text स्तर पर किया जाता है — यह फ्रेमवर्क सभी iOS टाइपोग्राफ़ी का आधार है।
डिस्क्रिप्टर से मेल खाने वाले सभी फ़ॉन्ट खोजने के लिए, matchingFontDescriptors विधि का उपयोग करें। यह प्रासंगिकता के अनुसार क्रमबद्ध डिस्क्रिप्टर की एक सरणी लौटाता है। डेवलपर सटीक मिलान (पहला तत्व) चुन सकता है या कस्टम तर्क के लिए विकल्पों पर पुनरावृति कर सकता है। Apple फ़ॉन्ट हैंडलिंग गाइड के अनुसार, किसी विशिष्ट परिवार के लिए नाम से गणना किए बिना उपलब्ध टाइपफ़ेस की सूची प्राप्त करने का यह एकमात्र तरीका है।
उपयोग मामला: टेक्स्ट सेटिंग्स इंटरफ़ेस में फ़ॉन्ट चुनते समय। उपयोगकर्ता एक परिवार चुनता है, और एप्लिकेशन सभी उपलब्ध टाइपफ़ेस प्राप्त करने और उन्हें पिकर में प्रदर्शित करने के लिए matchingFontDescriptors का उपयोग करता है। मिलान के बिना, डेवलपर्स को विकल्पों की एक सूची हार्ड-कोड करनी होगी जो iOS संस्करणों के बीच बदलती है।
let searchDescriptor = UIFontDescriptor.init(
fontAttributes: [.family: "SF Mono"]
)
// सभी उपलब्ध टाइपफ़ेस प्राप्त करें
let matchingDescriptors = searchDescriptor
.matchingFontDescriptors(withMandatoryKeys: nil)
for descriptor in matchingDescriptors {
print(descriptor.object(forKey: .visibleName) ?? "unnamed")
}
अनिवार्य कुंजियाँ — एक पैरामीटर जो खोज को प्रतिबंधित करता है। यदि आप [.family] निर्दिष्ट करते हैं, तो मिलान निर्दिष्ट परिवार के सभी फ़ॉन्ट लौटाता है। यदि आप [.family, .traits] निर्दिष्ट करते हैं — केवल वे जो परिवार और टाइपफ़ेस दोनों से मेल खाते हैं। अनिवार्य कुंजियों का उपयोग फ़ॉन्ट के उपसमूह की खोज करते समय मिलान को तेज़ करता है।
प्रदर्शन: मिलान एक सिंक्रोनस ऑपरेशन है जो iOS पर 0.5 से 5 मिलीसेकंड लेता है। एकल खोज के लिए यह नगण्य है, लेकिन डिस्क्रिप्टर पर बल्क पुनरावृति के लिए (उदाहरण के लिए, 50+ फ़ॉन्ट वाले पिकर में), परिणामों को कैश करने की अनुशंसा की जाती है। Apple स्क्रीन लोड करते समय एक बार मिलान करने और डिस्क्रिप्टर की सरणी सहेजने की अनुशंसा करता है।
Core Text iOS और macOS पर टाइपोग्राफ़ी के साथ काम करने के लिए एक निम्न-स्तरीय C-आधारित फ्रेमवर्क है। UIFontDescriptor का इसका समकक्ष CTFontDescriptor है, जो Core Foundation स्तर पर समान क्षमताएँ प्रदान करता है। CTFontDescriptor का उपयोग Core Text API में फ़ॉन्ट बनाने, टेक्स्ट मापने और जटिल टाइपोग्राफ़ी रेंडर करने के लिए किया जाता है। UIFontDescriptor मूलतः विस्तारित विशेषताओं के सेट के साथ CTFontDescriptor के चारों ओर एक Objective-C रैपर है।
UIFontDescriptor और CTFontDescriptor के बीच टोल-फ़्री ब्रिजिंग बिना रूपांतरण के UIKit और Core Text के बीच डिस्क्रिप्टर पास करने की अनुमति देती है। यह उन अनुप्रयोगों के लिए महत्वपूर्ण है जो कस्टम टेक्स्ट रेंडरिंग का उपयोग करते हैं — उदाहरण के लिए, TextKit-आधारित टेक्स्ट संपादक या सिंटैक्स हाइलाइटिंग वाले कोड संपादक। उदाहरण: CTFontDescriptorCreateCopyWithAttribute एक जोड़ी गई विशेषता के साथ डिस्क्रिप्टर की प्रतिलिपि बनाता है — UIFontDescriptor के addingAttributes का एक एनालॉग।
मुख्य विशेषता kCTFontURLAttribute CTFontDescriptor में फ़ॉन्ट फ़ाइल का URL रखती है। यह यह निर्धारित करने की अनुमति देती है कि फ़ॉन्ट सिस्टम है या कस्टम। कस्टम फ़ॉन्ट के लिए, URL फ़ॉन्ट फ़ाइल (.ttf या .otf) की ओर इशारा करता है; सिस्टम फ़ॉन्ट के लिए — सिस्टम फ़ॉन्ट निर्देशिका की ओर। डिस्क्रिप्टर के माध्यम से डेटा केवल पढ़ने योग्य है; URL के माध्यम से फ़ॉन्ट फ़ाइल को संशोधित करना समर्थित नहीं है।
उन्नत टाइपोग्राफ़ी — कस्टम लिगेचर, प्रासंगिक प्रतिस्थापन, वैकल्पिक ग्लिफ़ — के लिए, kCTFontFeatureSettingsAttribute कुंजी के साथ CTFontDescriptorCopyAttribute का उपयोग करें। इस विशेषता में OpenType सुविधा शब्दकोशों की एक सरणी होती है जिसे डिस्क्रिप्टर के माध्यम से जोड़ा जा सकता है। Apple Core Text प्रोग्रामिंग गाइड के अनुसार, UIFontDescriptor को Core Text के साथ संयोजित करने से एप्लिकेशन टाइपोग्राफ़ी पर पूर्ण नियंत्रण मिलता है।
अक्सर पूछे जाने वाले प्रश्न
UIFont एक उपयोग के लिए तैयार फ़ॉन्ट है जो टेक्स्ट रेंडर करता है। Font Descriptor एक फ़ॉन्ट विवरण है — विशेषताओं का एक सेट जिससे UIFont बनाया जा सकता है। एक डिस्क्रिप्टर विभिन्न आकारों के कई UIFont उत्पन्न कर सकता है।
हाँ। यदि फ़ॉन्ट सिस्टम में पंजीकृत है (Info.plist या Core Graphics के माध्यम से), तो उसका डिस्क्रिप्टर परिवार या नाम द्वारा बिल्कुल सिस्टम फ़ॉन्ट की तरह ही बनाया जाता है। मिलान किसी भी पंजीकृत फ़ॉन्ट के लिए काम करता है।
प्रदर्शित नाम प्राप्त करने के लिए descriptor.object(forKey: .visibleName) या PostScript नाम के लिए descriptor.postscriptName का उपयोग करें। PostScript नाम का उपयोग UIFont(name:size:) के माध्यम से फ़ॉन्ट बनाते समय किया जाता है।
कैस्केड सूची नेस्टेड डिस्क्रिप्टर की एक सरणी है जो फ़ॉलबैक फ़ॉन्ट के रूप में कार्य करती है। यदि प्राथमिक फ़ॉन्ट में आवश्यक वर्ण नहीं है, तो सिस्टम कैस्केड सूची से फ़ॉन्ट की क्रमिक रूप से जाँच करता है। इसका उपयोग इमोजी और CJK वर्ण समर्थन के लिए किया जाता है।
हाँ। SwiftUI Font(descriptor:size:) के माध्यम से Font Descriptor का समर्थन करता है। SwiftUI रैपर UIFontDescriptor स्वीकार करता है और सभी डिस्क्रिप्टर विशेषताओं — कर्निंग, लिगेचर और टाइपफ़ेस — को संरक्षित करते हुए SwiftUI फ़ॉन्ट बनाता है।
सारांश
हम एक मोबाइल एप्लिकेशन टर्नकी विकसित करेंगे
IT Sectr 2017 से स्टार्टअप और व्यवसायों के लिए iOS और Android एप्लिकेशन बनाता है। हम आपको सलाह देंगे और सर्वोत्तम समाधान प्रस्तावित करेंगे।
यह भी पढ़ें