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 سطر توڑنے کے باریک کنٹرول کے لیے LineBreak (Simple, Heading, Paragraph) کو بھی سپورٹ کرتا ہے، جو خاص طور پر کثیر لسانی متن کے لیے مفید ہے۔
// 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 ایپلیکیشنز بناتا ہے۔ ہم آپ کو مشورہ دیں گے اور بہترین حل تجویز کریں گے۔
مزید پڑھیں