ڈائنامک ٹائپ: کلیدی تصورات، ٹیکسٹ اسٹائلز اور iOS میں یہ کیسے کام کرتا ہے

مصنف: IT Sectr اشاعت: 2026-05-16 مطالعے کا وقت: 9 منٹ

Dynamic Type iOS کا ایک بلٹ‐ان فیچر ہے جو صارف کے سسٹم فونٹ سائز کی ترتیبات کے مطابق ایپ میں فونٹ کا سائز خود بخود تبدیل کرتا ہے۔ صارف ترتیبات → ڈسپلے اور چمک → ٹیکسٹ سائز میں مطلوبہ ٹیکسٹ سائز سیٹ کرتا ہے، اور Dynamic Type کو سپورٹ کرنے والی تمام ایپس بغیر کسی اضافی اقدامات کے خود بخود ڈھل جاتی ہیں۔ Apple Human Interface Guidelines, 2024 کے مطابق، Dynamic Type کی حمایت App Store میں شائع ہونے کے لیے لازمی شرط ہے، کیونکہ یہ iOS پلیٹ فارم پر accessibility کا بنیادی عنصر ہے۔

اہم نکات

  • Dynamic Type — iOS کا وہ میکانزم ہے جو فونٹ سائز کی سسٹم ترتیبات کے تحت خود بخود متن کو اسکیل کرتا ہے
  • حمایت ٹیکسٹ اسٹائلز (UIFont.TextStyle) — body, headline, caption, title اور دیگر کے ذریعے فراہم کی جاتی ہے
  • سسٹم XSmall سے AccessibilityXXXL تک 11 لیولز اسکیلنگ کو سپورٹ کرتا ہے
  • کسٹم فونٹس کے لیے UIFontMetrics طریقہ استعمال کیا جاتا ہے، جو کسی بھی فونٹ کو body اسٹائل کے نسبت اسکیل کرتا ہے
  • لے آؤٹ انکولی ہونا چاہیے — UIStackView, Auto Layout اور سیلز کی متحرک اونچائی لازمی ہے

iOS میں Dynamic Type کیا ہے

Dynamic Type iOS کی وہ ٹیکنالوجی ہے جو iOS 7 میں متعارف ہوئی، جو ایپ میں متن کو سسٹم فونٹ سائز کی ترتیبات کے مطابق خود بخود ڈھالنے دیتی ہے۔ صارف تمام ایپس میں ایک ساتھ فونٹ بڑھا یا گھٹا سکتا ہے — ہر ایپ کی ترتیبات علیحدہ سے تبدیل کرنے کی ضرورت نہیں۔

Apple WWDC 2023، “Make Your App Visually Accessible” کے مطابق، 40% سے زیادہ iOS صارفین فونٹ کا سائز معیاری سے تبدیل کرتے ہیں۔ 65+ عمر کے گروپ کے لیے یہ شرح 70% تک پہنچ جاتی ہے۔ Dynamic Type App Store کی accessibility تصدیق کے لیے لازمی شرط ہے۔ عدم حمایت ایپ کو جائزے میں مسترد کرنے کی وجہ بن سکتی ہے۔

کام کرنے کا اصول: ایپ UIFont(name:size:) کی بجائے UIFont.preferredFont(forTextStyle:) استعمال کرتی ہے۔ iOS خود بخود موجودہ سسٹم ترتیب کے مطابق اسکیل کردہ فونٹ واپس کرتا ہے۔ جب صارف ترتیبات میں سائز تبدیل کرتا ہے، iOS UIContentSizeCategory.didChangeNotification نوٹیفکیشن جنریٹ کرتا ہے — ایپ کو لے آؤٹ دوبارہ شمار کرنا چاہیے۔

Dynamic Type کی ترقی کی تاریخ

Dynamic Type iOS 7 میں “فلیٹ” ڈیزائن کے ساتھ متعارف ہوا۔ iOS 10 میں UIFontMetrics کے ذریعے کسٹم فونٹس کی حمایت شامل کی گئی۔ iOS 11 نے accessibility لیولز (AccessibilityXXXL تک) متعارف کرائے۔ iOS 15 نے SwiftUI میں خودکار حمایت کے ساتھ Dynamic Type شامل کیا۔ ہر ریلیز کے ساتھ Apple اپنی ضروریات سخت کرتا ہے: iOS 17 سے شروع کرتے ہوئے، Dynamic Type کی حمایت کے بغیر ایپس کو App Store Connect میں اپ لوڈ کرتے وقت انتباہ ملتا ہے۔

UIFont.TextStyle ٹیکسٹ اسٹائلز

iOS معیاری ترتیب کے لیے پہلے سے طے شدہ سائز اور انداز کے ساتھ 8 ٹیکسٹ اسٹائلز فراہم کرتا ہے:

اسٹائلمستقلسائز (L)مقصد
Large Title.largeTitle34pxاسکرین کا مرکزی عنوان
Title 1.title128pxسیکشن کا عنوان
Title 2.title222pxذیلی عنوان
Title 3.title320pxکارڈ کا عنوان
Headline.headline17px (bold)زور دینے کے لیے بولڈ
Body.body17pxبنیادی متن
Callout.callout16pxمعاون متن
Caption 1.caption112pxتصویر کے نیچے کیپشن
Caption 2.caption211pxچھوٹا کیپشن
Footnote.footnote13pxحواشی، نوٹ

صحیح اسٹائل کا استعمال صرف “ظاہری شکل” نہیں ہے۔ UIFont.TextStyle.body AccessibilityXXXL موڈ میں 53px تک پہنچ سکتا ہے۔ اگر ایپ body کے لیے 17px کا طے شدہ فونٹ استعمال کرتی ہے، تو متن بڑھے ہوئے فونٹ والے صارفین کے لیے ناقابل مطالعہ ہو جائے گا۔

اسٹائلز کے ذریعے بصری درجہ بندی

Dynamic Type صرف اسکیل نہیں کرتا — یہ بصری درجہ بندی کو بھی برقرار رکھتا ہے۔ Large Title ہمیشہ Title 1 سے بڑا ہوتا ہے، جو Body سے بڑا ہوتا ہے، اسکیلنگ کی سطح سے قطع نظر۔ اسکیلنگ کے تناسب مختلف ہوتے ہیں: عنوانات بنیادی متن سے زیادہ اسکیل ہوتے ہیں تاکہ accessibility لیولز پر بھی درجہ بندی برقرار رہے۔

اسکیلنگ کی سطحیں

iOS متن کی اسکیلنگ کے 11 لیولز کو سپورٹ کرتا ہے، جو دو اقسام میں تقسیم ہیں:

  • Standard sizes (5 لیولز): XS, S, M, L (پہلے سے طے شدہ), XL
  • Accessibility sizes (6 لیولز): accessibilityXL, accessibilityXXL, accessibilityXXXL, accessibilityXXXXL, accessibilityXXXXXL, accessibilityXXXXXXL

body اسٹائل کے لیے XS اور AccessibilityXXXL کے درمیان فرق 14px سے 53px تک ہے — تقریباً 4 گنا۔ 17px کے لیے ڈیزائن کردہ لے آؤٹ 53px پر مکمل طور پر ٹوٹ جاتا ہے: متن حدود سے باہر نکل جاتا ہے، بٹن اوورلیپ ہو جاتے ہیں، سیل ایک دوسرے پر چڑھ جاتے ہیں۔

کوڈ میں موجودہ کیٹیگری چیک کریں:

swift
let category = UIApplication.shared.preferredContentSizeCategory
// .extraSmall, .small, .medium, .large, .extraLarge ...
if category.isAccessibilityCategory {
    // متبادل لے آؤٹ فعال کریں
}

traitCollection اور ٹیکسٹ سائز

ٹیکسٹ سائز کی کیٹیگری traitCollection.uiContentSizeCategory کے ذریعے دستیاب ہے۔ جب سسٹم کی ترتیب تبدیل ہوتی ہے، iOS تمام UIView پر traitCollectionDidChange کال کرتا ہے۔ اس طریقہ میں فونٹس کو اپ ڈیٹ کرنا اور لے آؤٹ دوبارہ شمار کرنا ضروری ہے۔ SwiftUI یہ خود بخود کرتا ہے — UIKit میں دستی سبسکرپشن درکار ہے۔

UICollectionView کے لیے UICollectionViewCompositionalLayout استعمال کریں — یہ خود بخود کالموں کی تعداد کو اسکرین کی چوڑائی اور ٹیکسٹ سائز کے مطابق ڈھال لیتا ہے۔ accessibility لیولز پر دو کالموں والے لے آؤٹ سے سنگل کالم لے آؤٹ پر سوئچ کریں تاکہ متن کٹے نہیں اور عناصر ایک دوسرے پر نہ چڑھیں۔ conditional layout استعمال کریں: regular width کے لیے دو کالم، compact یا accessibility کے لیے ایک کالم۔

UIKit میں نفاذ

UIKit میں بنیادی نفاذ — UIFont.preferredFont(forTextStyle:)۔ یہ طریقہ موجودہ سسٹم ترتیب کے مطابق اسکیل کردہ فونٹ واپس کرتا ہے:

swift
titleLabel.font = UIFont.preferredFont(forTextStyle: .headline)
bodyLabel.font = UIFont.preferredFont(forTextStyle: .body)

کسٹم فونٹس کے لیے UIFontMetrics استعمال کریں:

swift
let customFont = UIFont(name: "Montserrat-Regular", size: 16)!
titleLabel.font = UIFontMetrics(forTextStyle: .body)
    .scaledFont(for: customFont)

// سائز کی تبدیلیوں کی نگرانی
NotificationCenter.default.addObserver(
    self,
    selector: #selector(preferredContentSizeChanged),
    name: UIContentSizeCategory.didChangeNotification,
    object: nil
)

UILabel کے لیے Interface Builder میں فونٹ کو ٹیکسٹ اسٹائل (Text Style) کے طور پر سیٹ کرنا اور “Automatically Adjusts Font” کو فعال کرنا کافی ہے۔ کسٹم فونٹس کے لیے IB UIFontMetrics کو سپورٹ نہیں کرتا — صرف کوڈ کے ذریعے۔

UIFontMetrics اور اسکیلنگ کریو

UIFontMetrics وہی اسکیلنگ کریو استعمال کرتا ہے جو preferredFont استعمال کرتا ہے۔ آپ fromTextStyle: .body, .headline وغیرہ سیٹ کر سکتے ہیں۔ ہر اسٹائل کا اپنا اسکیلنگ گتانک ہوتا ہے۔ Body معتدل طور پر اسکیل ہوتا ہے، Large Title — زیادہ۔ اگر آپ کا کسٹم فونٹ بنیادی متن کے لیے استعمال ہوتا ہے، تو .body استعمال کریں۔

SwiftUI میں Dynamic Type

SwiftUI میں Dynamic Type کی حمایت بطور ڈیفالٹ شامل ہے۔ تمام سسٹم موڈیفائر (.font(.body), .font(.title)) خود بخود اسکیل ہو جاتے ہیں۔ ڈویلپر کو UIFont.preferredFont کال کرنے کی ضرورت نہیں۔

مثال:

swift
Text("بنیادی متن")
    .font(.body)
    .lineLimit(nil)
    .minimumScaleFactor(0.5)

کسٹم اسکیلز کے لیے DynamicTypeSize استعمال کریں:

swift
@Environment(\.dynamicTypeSize) var dynamicTypeSize

var body: some View {
    Text("انکولی متن")
        .font(.body)
        .padding(dynamicTypeSize <= .large ? 8 : 16)
}

SwiftUI سسٹم ٹیکسٹ سائز کی تبدیلی پر خود بخود ویو کو اپ ڈیٹ کرتا ہے — نوٹیفکیشنز پر کسی اضافی سبسکرپشن کی ضرورت نہیں۔

SwiftUI میں Dynamic Type کی حدود

.font(.body) موڈیفائر صرف سسٹم فونٹ کے لیے کام کرتا ہے۔ SwiftUI میں کسٹم فونٹس کے لیے پردے کے پیچھے UIFontMetrics کے ساتھ Font.custom استعمال کریں۔ iOS 16 سے شروع کرتے ہوئے، SwiftUI @Environment میں DynamicTypeSize کو سپورٹ کرتا ہے، جو پیڈنگ اور کمپوزیشن کو ڈھالنے کی اجازت دیتا ہے۔

بڑے فونٹس کے لیے لے آؤٹ کی موافقت

Auto Layout Dynamic Type کی حمایت کے لیے لازمی شرط ہے۔ طے شدہ چوڑائیاں اور اونچائیاں (>=, <=) accessibility سائزز پر ٹوٹ جاتی ہیں۔ UILabel کے لیے intrinsicContentSize استعمال کریں — یہ موجودہ فونٹ سائز کے تحت خود بخود اونچائی شمار کرتا ہے۔

انکولی لے آؤٹ کے اصول:

  • UIStackView distribution = fill اور spacing = >= 8 کے ساتھ — عناصر اگلی لائن پر منتقل ہو جائیں گے
  • UITableViewCell automaticDimension کے ساتھ — سیل کی اونچائی مواد کے مطابق ڈھل جاتی ہے
  • UILabel پر numberOfLines = 0 — متن کٹتا نہیں بلکہ منتقل ہوتا ہے
  • edgeInsets والے بٹن — traitCollection.preferredContentSizeCategory کے ذریعے accessibility لیولز پر پیڈنگ شامل کریں

لمبے متن (مثلاً مضامین، استعمال کی شرائط) کے لیے UILabel پر minimumScaleFactor سیٹ کریں — یہ متن کو آخری صورت میں چھوٹا کرتا ہے جب Auto Layout مواد کو جگہ نہ دے سکے۔ قدر 0.5 کا مطلب ہے کہ فونٹ ترجیحی سائز کے 50% تک چھوٹا ہو سکتا ہے۔

سائز کیٹیگری کے تحت پیڈنگ کو ڈھالنے کی مثال:

swift
let isAccessibility = traitCollection
    .preferredContentSizeCategory.isAccessibilityCategory
stackView.spacing = isAccessibility ? 16 : 8
button.contentEdgeInsets = isAccessibility
    ? UIEdgeInsets(top: 16, left: 24, bottom: 16, right: 24)
    : UIEdgeInsets(top: 8, left: 16, bottom: 8, right: 16)

accessibility لیولز پر لے آؤٹ کے عام مسائل

متن کا کٹنا — numberOfLines = 1 اور طے شدہ چوڑائی والا UILabel AccessibilityXL پر متن کاٹ دیتا ہے۔ حل: numberOfLines = 0 اور trailing constraint۔ عناصر کا اوورلیپ — طے شدہ اونچائی والے بٹن ایک دوسرے پر چڑھ جاتے ہیں۔ حل: automatic spacing کے ساتھ UIStackView۔ اسکرین کی حدود سے باہر نکلنا — accessibility لیولز کے لیے ScrollView لازمی ہے۔

Dynamic Type کی جانچ

Xcode Simulator ٹیکسٹ سائز تبدیل کرنے کی اجازت دیتا ہے: سمیلیٹر مینو Settings → Accessibility → Display & Text Size → Larger Text۔ تمام 11 لیولز کے درمیان سوئچ کریں اور چیک کریں کہ متن نہ کٹے، بٹن قابل استعمال ہوں، لے آؤٹ ٹوٹے نہیں۔

خودکار جانچ کے لیے XCUIApplication میں contentSizeCategory ترتیب استعمال کریں:

swift
func testAccessibilitySizes() {
    let app = XCUIApplication()
    app.launchArguments += [
        "-UIPreferredContentSizeCategoryName",
        "UICTContentSizeCategoryAccessibilityXXXL"
    ]
    app.launch()
    app.scrollViews.buttons["بھیجیں"].tap()
    XCTAssertTrue(app.staticTexts["فارم بھیج دیا گیا"]
        .waitForExistence(timeout: 5))
}

XCUITest مختلف launchArguments کے ساتھ CI میں اسکیلنگ کے تمام لیولز چیک کرنے کی اجازت دیتا ہے۔ accessibility کیٹیگریز کو علیحدہ چیک کرنا نہ بھولیں — یہ اکثر لے آؤٹ توڑتی ہیں۔ Apple کے مطابق، Dynamic Type کے 70% بگز accessibility لیولز پر پائے جاتے ہیں کیونکہ ڈویلپر صرف معیاری سائزز کی جانچ کرتے ہیں۔

Accessibility Inspector: Dynamic Type کی جانچ

Xcode Accessibility Inspector دکھاتا ہے کہ منتخب عنصر کون سے فونٹ استعمال کر رہا ہے — طے شدہ یا اسکیل ایبل۔ اگر عنصر سمیلیٹر میں ٹیکسٹ سائز کی تبدیلی پر ردعمل نہیں دیتا، تو طے شدہ فونٹ استعمال ہو رہا ہے۔ اسے UIFont.preferredFont یا UIFontMetrics سے تبدیل کریں۔

اکثر پوچھے گئے سوالات

iOS میں Dynamic Type سادہ الفاظ میں کیا ہے؟

یہ سسٹم فونٹ سائز کی ترتیبات کے مطابق ایپ میں متن کا خودکار اسکیلنگ ہے۔ صارف ترتیبات میں سائز تبدیل کرتا ہے — تمام معاون ایپس بغیر ڈویلپر کی مداخلت کے ڈھل جاتی ہیں۔

کیا Dynamic Type صرف سسٹم فونٹس کے ساتھ کام کرتا ہے؟

نہیں۔ کسٹم فونٹس کے لیے UIFontMetrics(scaledFont:) استعمال کریں۔ یہ طریقہ کسی بھی فونٹ کو مخصوص ٹیکسٹ اسٹائل کے نسبت اسکیل کرتا ہے، تناسب برقرار رکھتے ہوئے۔

iOS اسکیلنگ کے کتنے لیولز کو سپورٹ کرتا ہے؟

11 لیولز: 5 معیاری (XS, S, M, L, XL) اور 6 accessibility لیولز (AccessibilityXL سے AccessibilityXXXXXL تک)۔ body فونٹ کا سائز 14px سے 53px تک مختلف ہو سکتا ہے۔

ٹیکسٹ سائز کی تبدیلیوں پر کیسے سبسکرائب کریں؟

UIKit میں UIContentSizeCategory.didChangeNotification کے ذریعے۔ SwiftUI میں @Environment(\.dynamicTypeSize) استعمال کریں — سسٹم ترتیب تبدیل ہونے پر ویو خود بخود اپ ڈیٹ ہو جائے گا۔

اگر Dynamic Type سپورٹ نہ کیا جائے تو کیا ہوگا؟

بڑھے ہوئے فونٹ والے صارفین کٹا ہوا متن، اوورلیپنگ عناصر اور ناکارہ بٹن دیکھیں گے۔ ایپ کو accessibility تقاضوں کی خلاف ورزی پر App Store Review پر مسترد کیا جا سکتا ہے۔

خلاصہ

  • Dynamic Type — iOS کا بلٹ‐ان میکانزم جو متن کو سسٹم ترتیبات کے تحت اسکیل کرتا ہے؛ App Store کے لیے لازمی
  • سسٹم فونٹس کے لیے UIFont.preferredFont(forTextStyle:) اور کسٹم فونٹس کے لیے UIFontMetrics استعمال کریں
  • iOS 11 لیولز اسکیلنگ کو سپورٹ کرتا ہے — XS سے AccessibilityXXXXXL تک (body کے لیے 14–53px)
  • SwiftUI میں Dynamic Type .font(.body) اور @Environment(\.dynamicTypeSize) کے ذریعے خود بخود کام کرتا ہے
  • لے آؤٹ انکولی ہونا چاہیے: UIStackView, ٹیبلز میں automaticDimension, numberOfLines = 0
  • تمام 11 لیولز کی جانچ کریں، خاص طور پر accessibility کیٹیگریز — ان پر 70% لے آؤٹ ٹوٹتے ہیں
  • UIKit ایپس کے لیے UIContentSizeCategory.didChangeNotification پر سبسکرپشن لازمی ہے

ہم ایک موبائل ایپلیکیشن ٹرنکی تیار کریں گے

IT Sectr 2017 سے اسٹارٹ اپس اور کاروبار کے لیے iOS اور Android ایپلیکیشنز بناتا ہے۔ ہم آپ کو مشورہ دیں گے اور بہترین حل تجویز کریں گے۔

پروجیکٹ پر بحث کریں

مزید پڑھیں