Attributed Text iOS SDK का एक तंत्र है, जो NSAttributedString और NSMutableAttributedString क्लासों द्वारा दर्शाया गया है, जो एक ही टेक्स्ट स्ट्रिंग के विभिन्न भागों पर अनेक शैलियों को लागू करने की अनुमति देता है। सामान्य NSString के विपरीत, Attributed String ना केवल अक्षरों को संग्रहीत करता है बल्कि प्रत्येक रेंज के लिए एक विशेषता शब्दकोश भी संग्रहीत करता है: फ़ॉन्ट, रंग, पंक्ति अंतराल, छाया और संरेखण। Apple Developer Documentation के अनुसार, Attributed String UILabel, UITextView और UITextField में स्वरूपित टेक्स्ट प्रदर्शित करने का आधार है। WebKit या तीसरे पक्ष की लाइब्रेरियों के बिना टेक्स्ट शैलीकरण का यह मानक तरीका है।
मुख्य बातें
NSAttributedString Foundation फ़्रेमवर्क का एक क्लास है जो अक्षर रेंजों से बँधे नामित विशेषताओं के एक समूह के साथ एक स्ट्रिंग का प्रतिनिधित्व करता है। प्रत्येक विशेषता एक कुंजी-मान युग्म है: कुंजी एक स्थिरांक (NSFontAttributeName, NSForegroundColorAttributeName) द्वारा परिभाषित होती है, और मान संगत ऑब्जेक्ट (UIFont, UIColor) होता है। विशेषताएँ NSRange के माध्यम से अक्षरों की एक रेंज पर लागू होती हैं।
यह क्लास सभी Apple प्लेटफ़ॉर्मों पर उपलब्ध है: iOS (2.0+), macOS, tvOS, watchOS। NSAttributedString अपरिवर्तनीय है — एक बार बनाने के बाद, इसकी विशेषताएँ स्थिर होती हैं। गतिशील परिवर्तनों के लिए NSMutableAttributedString का उपयोग किया जाता है, जो NSAttributedString से विरासत पाता है और setAttributes, addAttributes, addAttribute, removeAttribute विधियाँ जोड़ता है।
NSString बिना शैलीकरण जानकारी के अक्षरों की एक सरल स्ट्रिंग है। text के माध्यम से UILabel को भेजा गया कोई भी टेक्स्ट एक ही फ़ॉन्ट, रंग और आकार में प्रदर्शित होता है। NSAttributedString, attributedText के माध्यम से भेजा जाता है, प्रत्येक अक्षर को विशेषताओं का अपना सेट रखने की अनुमति देता है। UILabel, UITextView और UITextField स्वचालित रूप से NSAttributedString को पहचानते हैं और इसकी विशेषताओं के अनुसार टेक्स्ट को रेंडर करते हैं।
आंतरिक रूप से, NSAttributedString टेक्स्ट के साथ एक NSString और विशेषता रेंजों की एक सारणी संग्रहीत करता है। प्रत्येक रेंज एक NSRange संरचना और एक विशेषता शब्दकोश द्वारा दर्शाया जाता है। रेंडरिंग के दौरान, सिस्टम रेंजों के माध्यम से गुजरता है और प्रत्येक अनुभाग पर संगत विशेषताओं को लागू करता है। दक्षता विशेषता स्विचिंग की संख्या पर निर्भर करती है — छोटे अनुभागों पर बार-बार बदलाव से रेंडरिंग का समय बढ़ जाता है।
NSAttributedString की विशेषताएँ UIKit (iOS) और AppKit (macOS) में परिभाषित स्थिरांक हैं, प्रत्येक टेक्स्ट दृश शैलीकरण के एक विशिष्ट पहलू के अनुरूप है। सभी विशेषताएँ NSAttributedString.Key स्ट्रिंग हैं, और उनके मान विशिष्ट क्लासों के ऑब्जेक्ट होते हैं। विशेषताएँ अक्षर-स्तर (अक्षरों को प्रभावित करने वाली) और पैराग्रफ-स्तर (पैराग्रफों को प्रभावित करने वाली) में विभाजित होती हैं।
अक्षर-स्तर की विशेषताओं में फ़ॉन्ट (NSFontAttributeName), टेक्स्ट रंग (NSForegroundColorAttributeName), पृष्ठभूमि रंग (NSBackgroundColorAttributeName), रेखांकन (NSUnderlineStyleAttributeName), स्ट्राइकथ्रू (NSStrikethroughStyleAttributeName), छाया (NSShadowAttributeName) शामिल हैं। पैराग्रफ-स्तर की विशेषताएँ NSParagraphStyleAttributeName के माध्यम से निर्धारित की जाती हैं, जो संरेखण, इंडेंटेशन, पंक्ति अंतराल और टैबुलेशन को नियंत्रित करता है।
NSLinkAttributeName टेक्स्ट में एक क्लिक करने योग्य लिंक बनाता है: मान URL या स्ट्रिंग है। UITextView अंतरक्रिया सक्षम होने पर ऐसे लिंकों को स्वचालित रूप से संभालता है। NSAttachmentAttributeName एक NSTextAttachment — टेक्स्ट के अंदर एक छवि जो एक इनलाइन तत्व के रूप में प्रदर्शित होती है — को एम्बेड करने की अनुमति देता है। इसका उपयोग एक स्ट्रिंग के अंदर आइकन, इमोजी या कस्टम व्यू के साथ टेक्स्ट बनाने के लिए किया जाता है।
प्रत्येक NSAttributedString विशेषता का एक सत्त्वनिष्ठ रूप से टाइप किया गया मान होता है। iOS विकास में सबसे अधिक उपयोग की जाने वाली विशेषताओं पर नज़र डालते हैं। फ़ॉन्ट एक UIFont ऑब्जेक्ट के माध्यम से, रंग UIColor के माध्यम से, पंक्ति अंतराल NSMutableParagraphStyle के माध्यम से निर्धारित किया जाता है, जो एक ही ऑब्जेक्ट में संरेखण, इंडेंटेशन और अंतराल को कॉन्फ़िगर करने की अनुमति देता है।
| विशेषता कुंजी | मान प्रकार | उद्देश्य |
|---|---|---|
| NSFontAttributeName | UIFont | टेक्स्ट फ़ॉन्ट |
| NSForegroundColorAttributeName | UIColor | टेक्स्ट रंग |
| NSBackgroundColorAttributeName | UIColor | टेक्स्ट के पीछे पृष्ठभूमि रंग |
| NSUnderlineStyleAttributeName | NSNumber (Int) | रेखांकन शैली |
| NSParagraphStyleAttributeName | NSParagraphStyle | पैराग्रफ सेटिंग्स |
| NSKernAttributeName | NSNumber (Float) | अक्षर अंतराल (कर्निंग) |
NSParagraphStyle पैराग्रफ विशेषताओं के लिए एक कंटेनर है: alignment, lineSpacing, paragraphSpacing, firstLineHeadIndent, lineBreakMode, minimumLineHeight और अन्य। इन मापदंडों को संशोधित करने के लिए, एक NSMutableParagraphStyle बनाया जाता है, वांछित गुण निर्धारित किए जाते हैं, और ऑब्जेक्ट को NSParagraphStyleAttributeName विशेषता के मान के रूप में भेजा जाता है। NSAttributedString में पंक्ति अंतराल को नियंत्रित करने का यह एकमात्र तरीका है।
NSShadow टेक्स्ट में छाया जोड़ने की अनुमति देता है: पैरामीटर shadowOffset, shadowBlurRadius, shadowColor छाया के ऑफ़सेट, धुंधलेपन और रंग को निर्धारित करते हैं। रेखांकन और स्ट्राइकथ्रू विशेषताएँ शैली संयोजनों को स्वीकार करती हैं: NSUnderlineStyle.single, .double, .thick, .patternDash, .patternDot। लाइनों की मोटाई और रंग पर सटीक नियंत्रण के लिए NSUnderlineColorAttributeName और NSStrikethroughColorAttributeName का उपयोग किया जाता है।
Swift में NSAttributedString बनाना टेक्स्ट और एक विशेषता शब्दकोश के साथ एक इनिशियलाइज़र के माध्यम से, या चरण-दर-चरण शैली आवेदन के साथ NSMutableAttributedString के माध्यम से किया जाता है। मूल दृष्टिकोण पूरे टेक्स्ट के लिए एक विशेषता शब्दकोश परिभाषित करना है, फिर विशिष्ट रेंजों के लिए विशेषताएँ जोड़ना या संशोधित करना है।
एक सरल उदाहरण — पूरी स्ट्रिंग के लिए फ़ॉन्ट, रंग और संरेखण निर्धारित करना। विशेषता शब्दकोश NSAttributedString इनिशियलाइज़र को भेजा जाता है। शब्दकोश की कुंजीएँ NSAttributedString.Key स्थिरांक हैं, मान संगत UIKit ऑब्जेक्ट हैं। यह मूल मामला है जब पूरा टेक्स्ट एकसमान रूप से स्वरूपित होता है।
let attributes: [NSAttributedString.Key: Any] = [
.font: UIFont.systemFont(ofSize: 16),
.foregroundColor: UIColor.darkGray,
.paragraphStyle: let style = NSMutableParagraphStyle()
style.alignment = .center
style.lineSpacing = 4
return style
]
let attributedString = NSAttributedString(
string: "Hello world",
attributes: attributes
)
label.attributedText = attributedString
टेक्स्ट systemFont 16, गहरे सल्फ़र रंग, केंद्र संरेखण और 4pt पंक्ति अंतराल के साथ प्रदर्शित होगा। यह दृष्टिकोण स्थिर शीर्षकों और बटनों के लिए सुविधाजनक है।
NSMutableAttributedString टेक्स्ट के विभिन्न भागों पर अलग-अलग शैलियों को लागू करने की अनुमति देता है। विधि addAttribute एक रेंज में एक विशेषता जोड़ती है, addAttributes विशेषताओं का एक शब्दकोश जोड़ती है। विधि setAttributes एक रेंज की सभी मौcजूदा विशेषताओं को नए से बदल देती है। यह हायलाइट के साथ टेक्स्ट बनाने का मुख्य उपकरण है।
let text = "Price: 1999 rubles"
let attributed = NSMutableAttributedString(string: text)
attributed.addAttribute(.foregroundColor,
value: UIColor.green, range: NSRange(location: 6, length: 4))
attributed.addAttribute(.font,
value: UIFont.boldSystemFont(ofSize: 20), range: NSRange(location: 6, length: 4))
label.attributedText = attributed
शब्द “1999” हरा और बोल्ड होगा, बाकी का टेक्स्ट मानक होगा। NSRange की गणना मैनुअली की जाती है — अक्षरों में लंबाई की सही गणना करना महत्वपूर्ण है, खासकर इमोजी और यौगिक Unicode अक्षरों के साथ काम करते समय।
NSMutableAttributedString टेक्स्ट और विशेषताओं को गतिशील रूप से बदलने के लिए विधियाँ प्रदान करता है: append, insert, replace, delete, setAttributes, addAttribute, removeAttribute, enumerateAttributes। यह अलग-अलग स्रोतों से टेक्स्ट बनाने, शैलियों को संयोजित करने और इंटरफ़ेस घटनाओं का जवाब देने की अनुमति देता है।
अपरिवर्तनीय NSAttributedString के विपरीत, परिवर्तनीय संस्करण एक नया ऑब्जेक्ट बनाए बिना सामग्री बदलने का समर्थन करता है। यह टेक्स्ट एडिटर्स, चैट और फ़ॉर्म के लिए महत्वपूर्ण है जहां उपयोगकर्ता टेक्स्ट को संपादित कर सकता है और शैलियों को संरक्षित रहना चाहिए।
मैसेंजरों में, प्रत्येक संदेश में उपयोगकर्ता नाम (बोल्ड फ़ॉन्ट), संदेश पाठ (सामान्य), समय (सल्फ़र रंग) होता है। NSMutableAttributedString उपयुक्त विशेषताओं के साथ वांछित क्रम में भागों को जोड़कर एक ही बार में ऐसी स्ट्रिंग बनाने की अनुमति देता है।
let result = NSMutableAttributedString()
let name = NSAttributedString(string: "Anna: ",
attributes: [.font: UIFont.boldSystemFont(ofSize: 15)])
let message = NSAttributedString(string: "Hello, how are you?",
attributes: [.font: UIFont.systemFont(ofSize: 15)])
let time = NSAttributedString(string: " 12:30",
attributes: [.foregroundColor: UIColor.gray])
result.append(name)
result.append(message)
result.append(time)
label.attributedText = result
परिणाम तीन शैलीकृत अनुभागों के साथ एक ही स्ट्रिंग है। Append स्वचालित रूप से NSRange की गणना करता है, स्थितियों की मैनुअली गणना की आवश्यकता नहीं है। यह दृष्टिकोण किसी भी संख्या के खंडों के लिए मापनीय है।
enumerateAttributes(in:options:using:) विधि निर्दिष्ट अंतराल में सभी विशेषता रेंजों के माध्यम से गुजरती है। यह स्वरूपण विश्लेषण के लिए उपयोगी है: सभी लिंक ढूँढना, विशिष्ट विशेषताओं का रंग बदलना या टेक्स्ट को HTML में निर्यात करना। क्लोजर में वर्तमान अनुभाग का विशेषता शब्दकोश और NSRange भेजा जाता है।
UIKit में टेक्स्ट प्रदर्शित करने के लिए सभी प्रमुख UI घटक attributedText गुण के माध्यम से NSAttributedString का समर्थन करते हैं। UILabel स्थिर शैलीकृत टेक्स्ट प्रदर्शित करता है, UITextView संपादन और लिंक का समर्थन करता है, UITextField अलग-अलग प्लेसहोल्डर और दर्ज किए गए टेक्स्ट के लिए विशेषताएँ स्वीकार करता है।
UILabel शैलीकृत टेक्स्ट प्रदर्शित करने के लिए सबसे हल्का घटक है। यह सभी अक्षर-स्तर की विशेषताओं का समर्थन करता है लेकिन क्लिक करने योग्य लिंक को स्वचालित रूप से संभालता नहीं है (इसके लिए UITextView की आवश्यकता है)। UILabel शीर्षकों, लेबल और छोटे स्वरूपित टेक्स्ट के लिए आदर्श है।
UITextView NSLinkAttributeName को संभालता है और लिंक को अंतरक्रियात्मक तत्वों के रूप में प्रदर्शित करता है। इस कार्यक्षमता को सक्षम करने के लिए, isSelectable = true और isEditable = false सेट करें। जब किसी लिंक पर टप किया जाता है, तो डिलेगेट को textView(_:shouldInteractWith:in:interaction:) काल प्राप्त होता है। UITextView टेक्स्ट के अंदर छवियों के लिए NSTextAttachment का भी समर्थन करता है।
let text = "Details on developer.apple.com"
let attributed = NSMutableAttributedString(string: text)
attributed.addAttribute(.link,
value: URL(string: "https://developer.apple.com")!,
range: NSRange(location: 0, length: text.count))
textView.attributedText = attributed
textView.isSelectable = true
textView.isEditable = false
isSelectable और isEditable सेट करने के बाद, टेक्स्ट क्षेत्र एक स्थिर टेक्स्ट ब्लॉक की तरह व्यवहार करता है, लेकिन लिंक सक्रिय रहते हैं। UITextViewDelegate टप करने पर व्यवहार को नियंत्रित करता है।
Core Text टेक्स्ट रेंडरिंग के लिए Apple का एक निकन्न-स्तरीय फ़्रेमवर्क है जो सीधे NSAttributedString के साथ काम करता है। UIKit के विपरीत, Core Text NSAttributedString को सीधे प्रदर्शन ऑब्जेक्ट के रूप में उपयोग नहीं करता — बल्कि इसे CTFramesetter, फिर CTFrame में बदलता है और एक Core Graphics संदर्भ में रेंडर करता है। यह पंक्ति लेआउट और ग्लाइफ्स पर पूर्ण नियंत्रण देता है।
Core Text का उपयोग कस्टम टेक्स्ट लेआउट के लिए उचित है: कॉलम, इमेज रैपिंग, टेक्स्ट रोटेशन, गैर-मानक लाइन ब्रेक्स। Core Text के NSMutableParagraphStyle में वे विशेषताएँ शामिल हैं जो UIKit में नहीं हैं: kCTParagraphStyleSpecifierMaximumLineSpacing, kCTParagraphStyleSpecifierLineBreakMode अतिरिक्त मोड के साथ।
NSAttributedString UIKit और Core Text के बीच निर्विघ्न रूप से स्थानांतरित होता है, क्योंकि दोनों फ़्रेमवर्क एक ही प्रकार के साथ काम करते हैं। UIKit की विशेषताएँ (NSFontAttributeName, NSForegroundColorAttributeName) Core Text द्वारा स्वचालित रूप से पहचानी जाती हैं, और इसके विपरीत — Core Text की विशेषताएँ (kCTFontAttributeName) UIKit द्वारा पढ़ी जाती हैं। यह एक ही NSAttributedString ऑब्जेक्ट पर सरल कार्यों के लिए UIKit और कस्टम रेंडरिंग के लिए Core Text का उपयोग करने की अनुमति देता है।
अक्सर पूछे जाने वाले प्रश्न
NSString बिना शैलीकरण जानकारी के केवल टेक्स्ट संग्रहीत करता है। NSAttributedString प्रत्येक अक्षर रेंज के लिए एक विशेषता शब्दकोश के साथ टेक्स्ट को पूरक करता है। जब text गुण के माध्यम से UILabel को भेजा जाता है, तो NSString प्लेन टेक्स्ट के रूप में प्रदर्शित होता है। जब NSAttributedString को attributedText के माध्यम से भेजा जाता है, तो सभी विशेषताएँ लागू होती हैं: एक ही स्ट्रिंग में अलग-अलग फ़ॉन्ट, रंग और अंतराल।
एक विशेषता शब्दकोश के साथ addAttributes(_:range:) विधि का उपयोग करें: addAttributes([.font: font, .foregroundColor: color], range: range)। एक विशेषता जोड़ने या बदलने के लिए addAttribute(_:value:range:) का उपयोग करें। setAttributes विधि रेंज में सभी मौcजूदा विशेषताओं को प्रदान की गई विशेषताओं से बदल देती है।
एक NSMutableParagraphStyle बनाएं, lineSpacing गुण सेट करें, फिर इसे NSParagraphStyleAttributeName विशेषता के मान के रूप में भेजें। पूर्ण नियंत्रण के लिए, minimumLineHeight, maximumLineHeight, paragraphSpacing, lineBreakMode और alignment भी उपलब्ध हैं। ParagraphStyle पंक्ति अंतराल को नियंत्रित करने का एकमात्र तरीका है।
हाँ, SwiftUI iOS 15+ में Text(attributedString:) के माध्यम से NSAttributedString का समर्थन करता है। पुराने संस्करणों में, UILabel या UITextView के साथ UIViewRepresentable का उपयोग करें। SwiftUI Markdown-जैसी सिंटैक्स के साथ घोषणात्मक स्वरूपण के लिए अपना खुद का AttributedString प्रकार (SwiftUI, Foundation नहीं) भी प्रदान करता है।
boundingRect(with:options:context:) विधि का उपयोग करें, जो दी गई विशेषताओं के साथ स्ट्रिंग को प्रदर्शित करने के लिए आवश्यक CGRect लौटाता है। options पैरामीटर: [.usesLineFragmentOrigin, .usesFontLeading] पंक्ति अंतराल और फ़ॉन्ट मैट्रिक्स को ध्यान में रखता है। सीमित संख्या की पंक्तियों वाले UILabel के लिए, sizeThatFits का उपयोग करें।
सारांश
हम एक मोबाइल एप्लिकेशन टर्नकी विकसित करेंगे
IT Sectr 2017 से स्टार्टअप और व्यवसायों के लिए iOS और Android एप्लिकेशन बनाता है। हम आपको सलाह देंगे और सर्वोत्तम समाधान प्रस्तावित करेंगे।
यह भी पढ़ें