Dynamic Type: मुख्य अवधारणाएँ, टेक्स्ट स्टाइल और iOS में यह कैसे काम करता है

लेखक: IT Sectr प्रकाशित: 2026-05-16 पढ़ने का समय: 9 मिनट

Dynamic Type iOS की एक अंतर्निहित सुविधा है जो उपयोगकर्ता की सिस्टम सेटिंग्स के अनुसार ऐप में फ़ॉन्ट आकार को स्वचालित रूप से बदलती है। उपयोगकर्ता सेटिंग्स → डिस्प्ले और ब्राइटनेस → टेक्स्ट आकार में अपना पसंदीदा टेक्स्ट आकार सेट करता है, और Dynamic Type का समर्थन करने वाले सभी ऐप बिना किसी अतिरिक्त कार्रवाई के अनुकूलित हो जाते हैं। Apple Human Interface Guidelines, 2024 के अनुसार, Dynamic Type का समर्थन App Store पर प्रकाशन के लिए एक अनिवार्य आवश्यकता है, क्योंकि यह iOS प्लेटफ़ॉर्म पर एक्सेसिबिलिटी का मूलभूत तत्व है।

मुख्य बातें

  • 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 एक्सेसिबिलिटी प्रमाणन के लिए एक अनिवार्य आवश्यकता है। समर्थन की कमी समीक्षा के दौरान ऐप को अस्वीकार करने का कारण है।

यह कैसे काम करता है: ऐप UIFont(name:size:) के बजाय UIFont.preferredFont(forTextStyle:) का उपयोग करता है। iOS स्वचालित रूप से वर्तमान सिस्टम सेटिंग के अनुसार स्केल किया गया फ़ॉन्ट लौटाता है। जब सेटिंग्स में आकार बदलता है, iOS UIContentSizeCategory.didChangeNotification उत्पन्न करता है — ऐप को लेआउट की पुनर्गणना करनी चाहिए।

Dynamic Type का विकास इतिहास

Dynamic Type iOS 7 में फ्लैट डिज़ाइन के साथ आया। iOS 10 ने UIFontMetrics के माध्यम से कस्टम फ़ॉन्ट के लिए समर्थन जोड़ा। iOS 11 ने एक्सेसिबिलिटी स्तर (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 (बोल्ड)ज़ोर देने के लिए बोल्ड
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 से बड़ा होता है, भले ही स्केलिंग स्तर कुछ भी हो। स्केलिंग गुणांक अलग-अलग होते हैं: शीर्षक मुख्य टेक्स्ट की तुलना में अधिक आक्रामक रूप से स्केल होते हैं, ताकि पदानुक्रम एक्सेसिबिलिटी स्तरों पर भी बना रहे।

स्केलिंग स्तर

iOS टेक्स्ट स्केलिंग के 11 स्तरों का समर्थन करता है, जो दो श्रेणियों में विभाजित हैं:

  • मानक आकार (5 स्तर): XS, S, M, L (डिफ़ॉल्ट), XL
  • एक्सेसिबिलिटी आकार (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 का उपयोग करें — यह स्वचालित रूप से स्क्रीन चौड़ाई और टेक्स्ट आकार के अनुसार कॉलम की संख्या समायोजित करता है। एक्सेसिबिलिटी स्तरों पर, दो-कॉलम से एक-कॉलम लेआउट पर स्विच करें ताकि टेक्स्ट कटे नहीं और तत्व ओवरलैप न हों। सशर्त लेआउट का उपयोग करें: नियमित चौड़ाई के लिए — दो कॉलम, कॉम्पैक्ट या एक्सेसिबिलिटी के लिए — एक कॉलम।

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
)

Interface Builder में UILabel के लिए, बस फ़ॉन्ट को टेक्स्ट स्टाइल के रूप में सेट करें और “Automatically Adjusts Font” चालू करें। कस्टम फ़ॉन्ट के लिए, Interface Builder 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 समर्थन के लिए एक पूर्वापेक्षा है। फिक्स्ड चौड़ाई और ऊँचाई (>=, <=) एक्सेसिबिलिटी आकारों पर टूट जाती हैं। UILabel के लिए intrinsicContentSize का उपयोग करें — यह वर्तमान फ़ॉन्ट आकार के लिए स्वचालित रूप से ऊँचाई की गणना करता है।

अनुकूली लेआउट नियम:

  • UIStackView distribution = fill और spacing >= 8 के साथ — तत्व अगली पंक्ति में स्थानांतरित हो जाएँगे
  • UITableViewCell automaticDimension के साथ — सेल की ऊँचाई सामग्री के अनुसार समायोजित होती है
  • UILabel पर numberOfLines = 0 — टेक्स्ट कटता नहीं बल्कि रैप होता है
  • edgeInsets वाले बटन — traitCollection.preferredContentSizeCategory के माध्यम से एक्सेसिबिलिटी स्तरों पर पैडिंग जोड़ें

लंबे टेक्स्ट (जैसे लेख, उपयोग की शर्तें) के लिए, 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)

एक्सेसिबिलिटी स्तरों पर विशिष्ट लेआउट समस्याएँ

टेक्स्ट कटना — numberOfLines = 1 और फिक्स्ड चौड़ाई वाला UILabel AccessibilityXL पर टेक्स्ट काटता है। समाधान: numberOfLines = 0 और trailing constraint। तत्व ओवरलैप — फिक्स्ड ऊँचाई वाले बटन एक-दूसरे पर चढ़ जाते हैं। समाधान: स्वचालित स्पेसिंग के साथ UIStackView। स्क्रीन से बाहर सामग्री — एक्सेसिबिलिटी स्तरों के लिए ScrollView अनिवार्य है।

Dynamic Type का परीक्षण

Xcode सिम्युलेटर टेक्स्ट आकार बदलने की अनुमति देता है: सिम्युलेटर मेनू में 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))
}

विभिन्न launchArguments के साथ XCUITest आपको CI में सभी स्केलिंग स्तरों की जाँच करने की अनुमति देता है। एक्सेसिबिलिटी श्रेणियों को अलग से परीक्षण करना न भूलें — वे सबसे अधिक बार लेआउट तोड़ती हैं। Apple के अनुसार, 70% Dynamic Type बग विशेष रूप से एक्सेसिबिलिटी स्तरों पर पाए जाते हैं, क्योंकि डेवलपर केवल मानक आकारों का परीक्षण करते हैं।

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 एक्सेसिबिलिटी स्तर (AccessibilityXL से AccessibilityXXXXXL तक)। body फ़ॉन्ट का आकार 14px से 53px तक हो सकता है।

टेक्स्ट आकार परिवर्तनों की सदस्यता कैसे लें?

UIKit में UIContentSizeCategory.didChangeNotification के माध्यम से। SwiftUI में, @Environment(\.dynamicTypeSize) का उपयोग करें — सिस्टम सेटिंग बदलने पर दृश्य स्वचालित रूप से अपडेट होता है।

यदि Dynamic Type का समर्थन नहीं किया जाए तो क्या होगा?

बढ़े हुए फ़ॉन्ट वाले उपयोगकर्ता कटा हुआ टेक्स्ट, ओवरलैपिंग तत्व और टूटे हुए बटन देखेंगे। ऐप को एक्सेसिबिलिटी आवश्यकताओं के उल्लंघन के लिए App Store समीक्षा में अस्वीकार किया जा सकता है।

सारांश

  • 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 स्तरों का परीक्षण करें, विशेष रूप से एक्सेसिबिलिटी श्रेणियों का — 70% लेआउट उन पर टूटते हैं
  • UIKit ऐप के लिए UIContentSizeCategory.didChangeNotification की सदस्यता अनिवार्य है

हम एक मोबाइल एप्लिकेशन टर्नकी विकसित करेंगे

IT Sectr 2017 से स्टार्टअप और व्यवसायों के लिए iOS और Android एप्लिकेशन बनाता है। हम आपको सलाह देंगे और सर्वोत्तम समाधान प्रस्तावित करेंगे।

परियोजना पर चर्चा करें

यह भी पढ़ें