ParagraphStyle फ़ॉर्मेटिंग पैरामीटर्स का एक सेट है जो टेक्स्ट पैराग्राफ की विज़ुअल उपस्थिति को परिभाषित करता है। मोबाइल डेवलपमेंट में, ParagraphStyle में संरेखण (left, center, right, justified), लाइन स्पेसिंग, पहली पंक्ति का इंडेंटेशन, पैराग्राफ के बीच स्पेसिंग और टेक्स्ट दिशा शामिल है। Material Design Typography Guidelines (2025) के अनुसार, एप्लिकेशन की सभी स्क्रीन पर ParagraphStyle का सुसंगत उपयोग एक समान टाइपोग्राफ़िक लय सुनिश्चित करता है और सेक्शन के बीच स्विच करते समय विज़ुअल शोर को कम करता है।
मुख्य बिंदु
ParagraphStyle (पैराग्राफ शैली) फ़ॉर्मेटिंग नियमों का एक सेट है जो टेक्स्ट के एक या अधिक पैराग्राफ पर लागू होता है। कैरेक्टर शैलियों (bold, italic, font-size) के विपरीत जो अलग-अलग कैरेक्टर के स्तर पर काम करती हैं, ParagraphStyle मैक्रो-गुणों का प्रबंधन करता है: कंटेनर में टेक्स्ट का स्थान, लाइनों और पैराग्राफ के बीच स्पेसिंग, लेखन दिशा और हाइफ़नेशन नियम।
ऐतिहासिक रूप से, ParagraphStyle की अवधारणा डेस्कटॉप पब्लिशिंग सिस्टम (QuarkXPress, PageMaker, InDesign) से आई है, जहाँ प्रत्येक पैराग्राफ के अपने पैरामीटर होते थे। मोबाइल डेवलपमेंट में, यह दृष्टिकोण सॉफ़्टवेयर API में बदल गया: iOS पर NSMutableParagraphStyle, Android में ParagraphStyle और LineBreakStyle क्लास, और Flutter में textAlign और textHeightBehavior जैसे पैरामीटर। ये सभी एक उद्देश्य पूरा करते हैं — पैराग्राफ़ फ़ॉर्मेटिंग का प्रबंधन कोड के माध्यम से, किसी विशिष्ट टेक्स्ट इंजन से बंधे बिना।
Bringhurst — The Elements of Typographic Style (2024) के अनुसार, ParagraphStyle का उचित कॉन्फ़िगरेशन इंटरफ़ेस टाइपोग्राफ़िक संस्कृति की नींव है। यदि टाइपफ़ेस और फ़ॉन्ट आकार टेक्स्ट की «आवाज़» को परिभाषित करते हैं, तो पैराग्राफ शैली इसकी «साँस» को परिभाषित करती है: लय, विराम और उच्चारण। मोबाइल इंटरफ़ेस में जहाँ स्थान सीमित है, सही ParagraphStyle अधिक जानकारी को पठनीयता खोए बिना समाहित करने की अनुमति देता है।
ParagraphStyle में गुणों के कई समूह शामिल हैं, प्रत्येक एक विशिष्ट फ़ॉर्मेटिंग पहलू के लिए ज़िम्मेदार है। आइए मोबाइल API में उपलब्ध मुख्य पैरामीटर देखें। संरेखण मुख्य पैरामीटर है जो टेक्स्ट की क्षैतिज स्थिति निर्धारित करता है। iOS पर NSTextAlignment उपलब्ध है, Android पर — Layout.Alignment, Flutter में — TextAlign।
| गुण | iOS (NSMutableParagraphStyle) | Android (Compose) | Flutter (TextStyle) |
|---|---|---|---|
| संरेखण | alignment | textAlign | textAlign |
| बायाँ इंडेंट | headIndent | textIndent (Compose में) | — |
| दायाँ इंडेंट | tailIndent | — | — |
| पहली पंक्ति इंडेंट | firstLineHeadIndent | textIndent (firstLine) | — |
| पैराग्राफ के बीच स्पेसिंग | paragraphSpacing | paragraphStyle (lineHeight) | — |
| पैराग्राफ से पहले स्पेसिंग | paragraphSpacingBefore | — | — |
| टेक्स्ट दिशा | baseWritingDirection | TextDirection (Compose) | textDirection |
| लाइन ब्रेक मोड | lineBreakMode | overflow (TextStyle) | overflow (TextStyle) |
यह समझना महत्वपूर्ण है कि सभी गुण सभी प्लेटफ़ॉर्म पर समान रूप से उपलब्ध नहीं हैं। उदाहरण के लिए, पहली पंक्ति इंडेंट (firstLineHeadIndent) पूरी तरह से केवल iOS पर NSMutableParagraphStyle के माध्यम से समर्थित है। Android में, इस उद्देश्य के लिए LeadingMarginSpan के साथ SpannableString का उपयोग किया जाता है, और Flutter में — कस्टम TextSpan और padding के साथ RichText। क्रॉस-प्लेटफ़ॉर्म डेवलपमेंट (Flutter, React Native) में, कुछ ParagraphStyle गुणों को कंटेनर या Spacer के माध्यम से अनुकरण करना पड़ता है।
iOS में, पैराग्राफ शैली के साथ काम करने का मुख्य उपकरण NSMutableParagraphStyle क्लास है — NSParagraphStyle का उपवर्ग। यह पैराग्राफ़ फ़ॉर्मेटिंग के प्रबंधन के लिए गुणों का एक पूरा सेट प्रदान करता है और NSAttributedString के माध्यम से लागू किया जाता है। NSMutableParagraphStyle न केवल UILabel और UITextView में, बल्कि CTParagraphStyle के माध्यम से Core Text में भी उपयोग किया जाता है।
// iOS: पूर्ण ParagraphStyle कॉन्फ़िगरेशन
let paragraphStyle = NSMutableParagraphStyle()
// संरेखण
paragraphStyle.alignment = .justified // जस्टिफ़ाइड
// इंडेंटेशन
paragraphStyle.headIndent = 16 // बायाँ इंडेंट
paragraphStyle.tailIndent = -16 // दायाँ इंडेंट (नकारात्मक)
paragraphStyle.firstLineHeadIndent = 32 // पहली पंक्ति इंडेंट
// पैराग्राफ स्पेसिंग
paragraphStyle.paragraphSpacing = 12 // पैराग्राफ के बाद
paragraphStyle.paragraphSpacingBefore = 8 // पैराग्राफ से पहले
// लाइन ऊँचाई
paragraphStyle.minimumLineHeight = 24
paragraphStyle.maximumLineHeight = 24
let attributes: [NSAttributedString.Key: Any] = [
.font: UIFont.systemFont(ofSize: 16),
.paragraphStyle: paragraphStyle
]
let label = UILabel()
label.attributedText = NSAttributedString(
string: "This paragraph has a custom ParagraphStyle.\n\nSecond paragraph with 12 pt spacing.",
attributes: attributes
)
SwiftUI में, NSMutableParagraphStyle का कोई सीधा समकक्ष नहीं है — इसके बजाय मॉडिफ़ायर का संयोजन उपयोग किया जाता है: .multilineTextAlignment() संरेखण के लिए, .lineSpacing() लाइन स्पेसिंग के लिए। SwiftUI में पहली पंक्ति इंडेंटेशन और पैराग्राफ स्पेसिंग के लिए, Text + padding या AttributedString (iOS 15+ से उपलब्ध) का उपयोग करना पड़ता है, जो विशेषताओं के माध्यम से NSParagraphStyle का समर्थन करता है।
// SwiftUI: ParagraphStyle के साथ AttributedString (iOS 15+)
var attributed: AttributedString = """
This is the first paragraph with indent.
This is the second paragraph with 12 pt spacing.
"""
let ps = NSMutableParagraphStyle()
ps.paragraphSpacing = 12
ps.firstLineHeadIndent = 20
let container = AttributeContainer()
.paragraphStyle(ps)
attributed.mergeAttributes(container)
Text(attributed)
.font(.body)
Apple — Text Programming Guide (2025) के अनुसार, NSMutableParagraphStyle 14 विभिन्न फ़ॉर्मेटिंग पैरामीटर तक का समर्थन करता है। यह याद रखना महत्वपूर्ण है कि tailIndent कंटेनर की चौड़ाई के सापेक्ष ऋणात्मक मान के रूप में सेट किया जाता है, जबकि headIndent सकारात्मक है। यह गैर-स्पष्ट व्यवहार अक्सर नौसिखिए iOS डेवलपर्स में त्रुटियों का कारण बनता है।
Android में, ParagraphStyle का दृष्टिकोण View सिस्टम और Jetpack Compose के बीच भिन्न है। क्लासिक View सिस्टम में, पैराग्राफ पैरामीटर TextView के XML विशेषताओं (android:textAlignment, android:lineSpacingExtra) या android.text.style पैकेज से ParagraphStyle इंटरफ़ेस के कार्यान्वयन के साथ SpannableString के माध्यम से सेट किए जाते हैं।
// Android View सिस्टम: SpannableString के माध्यम से ParagraphStyle
val text = "First paragraph with settings.\n\nSecond paragraph."
val spannable = SpannableString(text)
// जस्टिफ़ाइड संरेखण
spannable.setSpan(
AlignmentSpan.Standard(Layout.Alignment.ALIGN_NORMAL),
0, text.length,
Spannable.SPAN_PARAGRAPH
)
// LeadingMarginSpan के माध्यम से पहली पंक्ति इंडेंट
spannable.setSpan(
LeadingMarginSpan.Standard(0, 20),
0, text.indexOf('\n'),
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE
)
textView.text = spannable
Jetpack Compose में, ParagraphStyle TextStyle पैरामीटर के माध्यम से प्रबंधित किया जाता है। संरेखण के लिए textAlign, लाइन स्पेसिंग के लिए lineHeight (sp या em में), और पहली पंक्ति इंडेंटेशन के लिए textIndent का उपयोग किया जाता है। Compose लाइन ब्रेक (Simple, Heading, Paragraph) के बेहतरीन नियंत्रण के लिए LineBreak का भी समर्थन करता है, जो बहुभाषी टेक्स्ट के लिए विशेष रूप से उपयोगी है।
// Jetpack Compose: TextStyle के माध्यम से ParagraphStyle
Text(
text = "कस्टम शैली के साथ पहला पैराग्राफ।
इंडेंट के साथ दूसरा पैराग्राफ।",
style = TextStyle(
textAlign = TextAlign.Justify,
lineHeight = 24.sp,
textIndent = TextIndent(firstLine = 16.sp),
lineBreak = LineBreak.Paragraph
)
)
Android Developers — Compose ParagraphStyle (2025) के अनुसार, Compose में TextIndent का उपयोग करते समय firstLine को sp (dp में नहीं) में सेट करना महत्वपूर्ण है, क्योंकि पहली पंक्ति का इंडेंट टेक्स्ट के साथ स्केल होना चाहिए। यदि इंडेंट dp में सेट किया गया है, तो फ़ॉन्ट आकार बढ़ने पर पहली पंक्ति का इंडेंट दृष्टिगत रूप से छोटा हो जाएगा, जिससे टाइपोग्राफ़िक अनुपात बिगड़ जाएगा।
Flutter में, ParagraphStyle प्रतिमान को एक समर्पित क्लास में अलग नहीं किया गया है — इसके बजाय, TextStyle पैरामीटर और अतिरिक्त क्लास का संयोजन उपयोग किया जाता है। संरेखण TextAlign के माध्यम से, लाइन स्पेसिंग height (बिना इकाई) के माध्यम से सेट की जाती है, और TextHeightBehavior पहली और अंतिम पंक्ति के दृश्य इंडेंट को नियंत्रित करता है।
// Flutter: Text पैरामीटर के माध्यम से ParagraphStyle
Text(
'Flutter में स्टाइल किया गया पैराग्राफ।
इंडेंट के साथ दूसरा पैराग्राफ।',
style: TextStyle(
fontSize: 16,
height: 1.5,
leadingDistribution: TextLeadingDistribution.proportional,
),
textAlign: TextAlign.justify,
textHeightBehavior: TextHeightBehavior(
applyHeightToFirstAscent: true,
applyHeightToLastDescent: true,
),
)
अधिक जटिल परिदृश्यों के लिए, Flutter कस्टम TextSpan और WidgetSpan के साथ RichText का उपयोग प्रदान करता है। यह एक समान फ़ॉर्मेटिंग नियमों को बनाए रखते हुए, एक ही पैराग्राफ में इनलाइन विजेट (आइकन, छवियाँ) के साथ टेक्स्ट को संयोजित करने की अनुमति देता है। हालाँकि, इस दृष्टिकोण के लिए लाइन ब्रेक के मैन्युअल नियंत्रण की आवश्यकता होती है और यह स्वचालित हाइफ़नेशन का समर्थन नहीं करता है।
// Flutter: कस्टम पैराग्राफ फ़ॉर्मेटिंग के साथ RichText
RichText(
text: TextSpan(
style: TextStyle(fontSize: 16, height: 1.5),
children: [
TextSpan(text: 'First paragraph with icon '),
WidgetSpan(
child: Icon(Icons.star, size: 16),
alignment: PlaceholderAlignment.middle,
),
TextSpan(text: '\n\nSecond paragraph after spacing.'),
],
),
)
Flutter Documentation — Text Widget (2025) के अनुसार, TextHeightBehavior Flutter में ParagraphStyle के सही प्रदर्शन के लिए एक महत्वपूर्ण पैरामीटर है। यदि applyHeightToFirstAscent को false पर सेट किया जाता है, तो पहली पंक्ति के शीर्ष इंडेंट को अनदेखा कर दिया जाता है, और टेक्स्ट कंटेनर की ऊपरी सीमा से «चिपक» जाता है। यह शीर्षकों के लिए उपयोगी है, लेकिन मुख्य टेक्स्ट के लिए अवांछनीय है।
ParagraphStyle को प्रत्येक लोकेल के लिए लेखन दिशा को ध्यान में रखना चाहिए। अरबी, हिब्रू या उर्दू (दाएँ-से-बाएँ लेखन, RTL) के समर्थन वाले मोबाइल ऐप में, इंडेंटेशन और संरेखण को दर्पण की तरह बदलना चाहिए। iOS baseWritingDirection = .natural के माध्यम से स्वचालित स्विचिंग का समर्थन करता है, Android — TextDirection के माध्यम से, Flutter — textDirection के माध्यम से।
RTL लोकेल के लिए संरेखण कॉन्फ़िगरेशन पर विशेष ध्यान देने की आवश्यकता है। यदि LTR मोड में headIndent बाएँ इंडेंट को सेट करता है, तो RTL में यह स्वचालित रूप से दाएँ इंडेंट बन जाता है। हालाँकि, सभी कार्यान्वयन संरेखण स्पष्ट रूप से निर्दिष्ट होने पर इस संक्रमण को सही ढंग से संभाल नहीं पाते हैं (NSTextAlignment.natural के बजाय NSTextAlignment.left)। Google Internationalization Guide (2025) के अनुसार, बहुभाषी ऐप के लिए हमेशा प्राकृतिक संरेखण का उपयोग करें और दोनों लेआउट में इंडेंट की जाँच करें।
// Android: ParagraphStyle में RTL समर्थन
val textView = TextView(context)
// स्वचालित RTL समर्थन सक्षम करें
textView.textDirection = View.TEXT_DIRECTION_LOCALE
textView.textAlignment = View.TEXT_ALIGNMENT_TEXT_START
// RTL समर्थन के साथ Spannable
val spannable = SpannableString(arabicText)
spannable.setSpan(
AlignmentSpan.Standard(Layout.Alignment.ALIGN_NORMAL),
0, arabicText.length,
Spannable.SPAN_PARAGRAPH
)
क्षेत्रीय विशेषताओं में पहली पंक्ति इंडेंट के लिए अलग-अलग नियम भी शामिल हैं। यूरोपीय टाइपोग्राफ़ी में, पहली पंक्ति इंडेंट (firstLineHeadIndent) पैराग्राफ पृथक्करण के लिए एक मानक है। जापानी और चीनी टाइपोग्राफ़ी में, पहली पंक्ति इंडेंट का भी उपयोग किया जाता है, लेकिन इसका आकार भिन्न हो सकता है (आमतौर पर यूरोपीय परंपरा में 1.5 em के मुकाबले 1 em)। अरबी टाइपोग्राफ़ी के लिए, पहली पंक्ति इंडेंट दुर्लभ है — पैराग्राफ अक्सर ऊर्ध्वाधर स्पेसिंग द्वारा अलग किए जाते हैं।
सबसे आम गलती केवल वैश्विक टेक्स्ट फ़ील्ड विशेषताओं के माध्यम से ParagraphStyle का उपयोग करना है, बिना अलग-अलग पैराग्राफ के अलग-अलग फ़ॉर्मेटिंग पर विचार किए। एक UILabel या TextView में कई पैराग्राफ के साथ द्वारा अलग किए गए, ParagraphStyle पूरे टेक्स्ट पर समान रूप से लागू होता है, जब तक कि प्रत्येक पैराग्राफ के लिए अलग-अलग शैलियों के साथ एट्रिब्यूटेड टेक्स्ट का उपयोग नहीं किया जाता है।
UX Collective — Common Typography Bugs in Mobile Apps (2025) के अनुसार, ParagraphStyle की समस्याएँ मोबाइल एप्लिकेशन में सभी टाइपोग्राफ़िक बग का 18% हिस्सा हैं। सबसे महत्वपूर्ण मामले तब होते हैं जब गलत paragraphSpacing विभिन्न पंक्तियों पर टेक्स्ट ओवरलैप की ओर ले जाता है या जब RTL लोकेल LTR इंडेंट के साथ प्रदर्शित होते हैं। विभिन्न भाषाओं में परीक्षण स्ट्रिंग के साथ प्रत्येक ParagraphStyle पैरामीटर के लिए यूनिट परीक्षण बनाने की अनुशंसा की जाती है।
अक्सर पूछे जाने वाले प्रश्न
NSMutableParagraphStyle पैराग्राफ फ़ॉर्मेटिंग (संरेखण, इंडेंटेशन, लाइन स्पेसिंग) का प्रबंधन करता है, जबकि TextStyle कैरेक्टर विशेषताओं (फ़ॉन्ट, रंग, आकार) का प्रबंधन करता है। दोनों NSAttributedString के माध्यम से लागू किए जाते हैं। ParagraphStyle पैराग्राफ स्तर पर काम करता है, TextStyle कैरेक्टर स्तर पर। एक पैराग्राफ में TextStyle के कई उदाहरण हो सकते हैं, लेकिन प्रति पैराग्राफ केवल एक ParagraphStyle।
Jetpack Compose में, पहली पंक्ति इंडेंट TextStyle के अंदर TextIndent के माध्यम से सेट किया जाता है: TextStyle(textIndent = TextIndent(firstLine = 16.sp))। मान sp में होना चाहिए ताकि यह टेक्स्ट के साथ स्केल हो। बहु-पंक्ति टेक्स्ट के लिए, इंडेंट प्रत्येक पंक्ति पर लागू होता है जो एक नया पैराग्राफ ( कैरेक्टर) शुरू करती है। पहले पैराग्राफ के लिए, इंडेंट हमेशा लागू होता है।
SwiftUI में, paragraphSpacing का कोई सीधा समकक्ष नहीं है। पैराग्राफ स्पेसिंग के लिए, NSMutableParagraphStyle और paragraphSpacing गुण के साथ AttributedString (iOS 15+) का उपयोग करें। या Text("...\n\n...") के माध्यम से पैराग्राफ को अलग करें और टेक्स्ट ब्लॉक के बीच .padding() जोड़ें। जटिल टाइपोग्राफ़िक परिदृश्यों के लिए, UILabelRepresentable के माध्यम से NSAttributedString का उपयोग करें।
Android में TextView में paragraphSpacing गुण नहीं है — यह LeadingMarginSpan के साथ SpannableString के माध्यम से या कस्टम LineBackgroundSpan के माध्यम से सेट किया जाता है। लाइन स्पेसिंग के लिए setLineSpacing का उपयोग करें; पैराग्राफ स्पेसिंग के लिए, पैराग्राफ को अतिरिक्त से अलग करें या कई TextView इंस्टेंस के संयुक्त कंटेनर का उपयोग करें।
उचित ParagraphStyle पहुँच में सुधार करता है: पर्याप्त paragraphSpacing संज्ञानात्मक हानि वाले उपयोगकर्ताओं को पैराग्राफ सीमाओं को बेहतर ढंग से पहचानने में मदद करता है। WCAG 2.2 पैराग्राफ के दृश्य पृथक्करण (इंडेंटेशन या स्पेसिंग) की अनुशंसा करता है। ParagraphSpacing 1.5 × line-height से कम नहीं होना चाहिए। RTL लोकेल के लिए, सत्यापित करें कि इंडेंटेशन सही ढंग से प्रतिबिंबित हो।
सारांश
हम एक मोबाइल एप्लिकेशन टर्नकी विकसित करेंगे
IT Sectr 2017 से स्टार्टअप और व्यवसायों के लिए iOS और Android एप्लिकेशन बनाता है। हम आपको सलाह देंगे और सर्वोत्तम समाधान प्रस्तावित करेंगे।
यह भी पढ़ें