Dynamic Type iOS की एक अंतर्निहित सुविधा है जो उपयोगकर्ता की सिस्टम सेटिंग्स के अनुसार ऐप में फ़ॉन्ट आकार को स्वचालित रूप से बदलती है। उपयोगकर्ता सेटिंग्स → डिस्प्ले और ब्राइटनेस → टेक्स्ट आकार में अपना पसंदीदा टेक्स्ट आकार सेट करता है, और Dynamic Type का समर्थन करने वाले सभी ऐप बिना किसी अतिरिक्त कार्रवाई के अनुकूलित हो जाते हैं। Apple Human Interface Guidelines, 2024 के अनुसार, Dynamic Type का समर्थन App Store पर प्रकाशन के लिए एक अनिवार्य आवश्यकता है, क्योंकि यह iOS प्लेटफ़ॉर्म पर एक्सेसिबिलिटी का मूलभूत तत्व है।
मुख्य बातें
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 iOS 7 में फ्लैट डिज़ाइन के साथ आया। iOS 10 ने UIFontMetrics के माध्यम से कस्टम फ़ॉन्ट के लिए समर्थन जोड़ा। iOS 11 ने एक्सेसिबिलिटी स्तर (AccessibilityXXXL तक) पेश किए। iOS 15 ने स्वचालित समर्थन के साथ SwiftUI में Dynamic Type जोड़ा। प्रत्येक रिलीज़ के साथ, Apple आवश्यकताओं को कड़ा करता है: iOS 17 से शुरू करके, Dynamic Type समर्थन के बिना ऐप को App Store Connect पर अपलोड करने पर चेतावनी मिलती है।
iOS डिफ़ॉल्ट सेटिंग के लिए 8 टेक्स्ट स्टाइल प्रदान करता है, प्रत्येक का पूर्वनिर्धारित आकार और वज़न होता है:
| स्टाइल | स्थिरांक | आकार (L) | उद्देश्य |
|---|---|---|---|
| Large Title | .largeTitle | 34px | स्क्रीन का मुख्य शीर्षक |
| Title 1 | .title1 | 28px | अनुभाग शीर्षक |
| Title 2 | .title2 | 22px | उपशीर्षक |
| Title 3 | .title3 | 20px | कार्ड शीर्षक |
| Headline | .headline | 17px (बोल्ड) | ज़ोर देने के लिए बोल्ड |
| Body | .body | 17px | मुख्य टेक्स्ट |
| Callout | .callout | 16px | सहायक टेक्स्ट |
| Caption 1 | .caption1 | 12px | छवि के नीचे कैप्शन |
| Caption 2 | .caption2 | 11px | छोटा कैप्शन |
| Footnote | .footnote | 13px | फ़ुटनोट, टिप्पणी |
सही स्टाइल का उपयोग करना केवल “दिखावट” के बारे में नहीं है। UIFont.TextStyle.body AccessibilityXXXL मोड में 53px तक पहुँच सकता है। यदि ऐप body के लिए 17px का फिक्स्ड फ़ॉन्ट उपयोग करता है, तो टेक्स्ट उन उपयोगकर्ताओं के लिए अपठनीय हो जाता है जिन्होंने फ़ॉन्ट आकार बढ़ाया है।
Dynamic Type केवल स्केल नहीं करता — यह विज़ुअल पदानुक्रम को संरक्षित करता है। Large Title हमेशा Title 1 से बड़ा होता है, जो Body से बड़ा होता है, भले ही स्केलिंग स्तर कुछ भी हो। स्केलिंग गुणांक अलग-अलग होते हैं: शीर्षक मुख्य टेक्स्ट की तुलना में अधिक आक्रामक रूप से स्केल होते हैं, ताकि पदानुक्रम एक्सेसिबिलिटी स्तरों पर भी बना रहे।
iOS टेक्स्ट स्केलिंग के 11 स्तरों का समर्थन करता है, जो दो श्रेणियों में विभाजित हैं:
body स्टाइल के लिए XS और AccessibilityXXXL के बीच का अंतर 14px से 53px तक है — लगभग 4×। 17px के लिए डिज़ाइन किया गया लेआउट 53px पर पूरी तरह से टूट जाता है: टेक्स्ट ओवरफ़्लो होता है, बटन ओवरलैप होते हैं, सेल टकराती हैं।
कोड में वर्तमान श्रेणी जाँचें:
let category = UIApplication.shared.preferredContentSizeCategory
// .extraSmall, .small, .medium, .large, .extraLarge ...
if category.isAccessibilityCategory {
// वैकल्पिक लेआउट सक्षम करें
}
टेक्स्ट आकार श्रेणी traitCollection.uiContentSizeCategory के माध्यम से उपलब्ध है। जब सिस्टम सेटिंग बदलती है, iOS सभी UIView पर traitCollectionDidChange को कॉल करता है। इस विधि में, आपको फ़ॉन्ट अपडेट करने और लेआउट की पुनर्गणना करने की आवश्यकता है। SwiftUI यह स्वचालित रूप से करता है — UIKit को मैन्युअल सब्सक्रिप्शन की आवश्यकता है।
UICollectionView के लिए, UICollectionViewCompositionalLayout का उपयोग करें — यह स्वचालित रूप से स्क्रीन चौड़ाई और टेक्स्ट आकार के अनुसार कॉलम की संख्या समायोजित करता है। एक्सेसिबिलिटी स्तरों पर, दो-कॉलम से एक-कॉलम लेआउट पर स्विच करें ताकि टेक्स्ट कटे नहीं और तत्व ओवरलैप न हों। सशर्त लेआउट का उपयोग करें: नियमित चौड़ाई के लिए — दो कॉलम, कॉम्पैक्ट या एक्सेसिबिलिटी के लिए — एक कॉलम।
UIKit में मूल कार्यान्वयन — UIFont.preferredFont(forTextStyle:)। यह विधि वर्तमान सिस्टम सेटिंग के अनुसार स्केल किया गया फ़ॉन्ट लौटाती है:
titleLabel.font = UIFont.preferredFont(forTextStyle: .headline)
bodyLabel.font = UIFont.preferredFont(forTextStyle: .body)
कस्टम फ़ॉन्ट के लिए, UIFontMetrics का उपयोग करें:
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 वही स्केलिंग वक्र उपयोग करता है जो preferredFont उपयोग करता है। आप fromTextStyle: .body, .headline आदि निर्दिष्ट कर सकते हैं। प्रत्येक स्टाइल का अपना स्केलिंग गुणांक होता है। Body मध्यम रूप से स्केल होता है, Large Title आक्रामक रूप से स्केल होता है। यदि आपका कस्टम फ़ॉन्ट मुख्य टेक्स्ट के लिए उपयोग होता है, तो .body का उपयोग करें।
SwiftUI में, Dynamic Type का समर्थन डिफ़ॉल्ट रूप से अंतर्निहित है। सभी सिस्टम मॉडिफ़ायर (.font(.body), .font(.title)) स्वचालित रूप से स्केल होते हैं। डेवलपर को UIFont.preferredFont कॉल करने की आवश्यकता नहीं है।
उदाहरण:
Text("मुख्य टेक्स्ट")
.font(.body)
.lineLimit(nil)
.minimumScaleFactor(0.5)
कस्टम स्केल के लिए, DynamicTypeSize का उपयोग करें:
@Environment(\.dynamicTypeSize) var dynamicTypeSize
var body: some View {
Text("अनुकूली टेक्स्ट")
.font(.body)
.padding(dynamicTypeSize <= .large ? 8 : 16)
}
SwiftUI सिस्टम टेक्स्ट आकार बदलने पर दृश्य को स्वचालित रूप से अपडेट करता है — किसी अतिरिक्त अधिसूचना सब्सक्रिप्शन की आवश्यकता नहीं।
.font(.body) मॉडिफ़ायर केवल सिस्टम फ़ॉन्ट के लिए काम करता है। SwiftUI में कस्टम फ़ॉन्ट के लिए, UIFontMetrics के साथ Font.custom का उपयोग करें। iOS 16 से शुरू करके, SwiftUI @Environment में DynamicTypeSize का समर्थन करता है, जो पैडिंग और लेआउट को अनुकूलित करने की अनुमति देता है।
Auto Layout Dynamic Type समर्थन के लिए एक पूर्वापेक्षा है। फिक्स्ड चौड़ाई और ऊँचाई (>=, <=) एक्सेसिबिलिटी आकारों पर टूट जाती हैं। UILabel के लिए intrinsicContentSize का उपयोग करें — यह वर्तमान फ़ॉन्ट आकार के लिए स्वचालित रूप से ऊँचाई की गणना करता है।
अनुकूली लेआउट नियम:
लंबे टेक्स्ट (जैसे लेख, उपयोग की शर्तें) के लिए, UILabel पर minimumScaleFactor सेट करें — यह अंतिम उपाय के रूप में टेक्स्ट को कम करता है जब Auto Layout सामग्री को समायोजित नहीं कर सकता। मान 0.5 का अर्थ है कि फ़ॉन्ट पसंदीदा आकार के 50% तक सिकुड़ सकता है।
आकार श्रेणी के अनुसार पैडिंग समायोजित करने का उदाहरण:
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 अनिवार्य है।
Xcode सिम्युलेटर टेक्स्ट आकार बदलने की अनुमति देता है: सिम्युलेटर मेनू में Settings → Accessibility → Display & Text Size → Larger Text पर जाएँ। सभी 11 स्तरों के बीच स्विच करें और सत्यापित करें कि टेक्स्ट कटता नहीं है, बटन सुलभ हैं, और लेआउट टूटता नहीं है।
स्वचालित परीक्षण के लिए, XCUIApplication में contentSizeCategory सेटिंग का उपयोग करें:
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 बग विशेष रूप से एक्सेसिबिलिटी स्तरों पर पाए जाते हैं, क्योंकि डेवलपर केवल मानक आकारों का परीक्षण करते हैं।
Xcode Accessibility Inspector दिखाता है कि चयनित तत्व किन फ़ॉन्ट का उपयोग करता है — फिक्स्ड या स्केलेबल। यदि तत्व सिम्युलेटर में टेक्स्ट आकार बदलने पर प्रतिक्रिया नहीं करता, तो फिक्स्ड फ़ॉन्ट का उपयोग हो रहा है। इसे UIFont.preferredFont या UIFontMetrics से बदलें।
अक्सर पूछे जाने वाले प्रश्न
यह सिस्टम आकार सेटिंग्स के अनुसार ऐप में स्वचालित टेक्स्ट स्केलिंग है। उपयोगकर्ता सेटिंग्स में आकार बदलता है — सभी समर्थित ऐप डेवलपर की भागीदारी के बिना अनुकूलित हो जाते हैं।
नहीं। कस्टम फ़ॉन्ट के लिए, UIFontMetrics(scaledFont:) का उपयोग करें। यह विधि किसी भी फ़ॉन्ट को निर्दिष्ट टेक्स्ट स्टाइल के सापेक्ष स्केल करती है, अनुपात बनाए रखते हुए।
11 स्तर: 5 मानक (XS, S, M, L, XL) और 6 एक्सेसिबिलिटी स्तर (AccessibilityXL से AccessibilityXXXXXL तक)। body फ़ॉन्ट का आकार 14px से 53px तक हो सकता है।
UIKit में UIContentSizeCategory.didChangeNotification के माध्यम से। SwiftUI में, @Environment(\.dynamicTypeSize) का उपयोग करें — सिस्टम सेटिंग बदलने पर दृश्य स्वचालित रूप से अपडेट होता है।
बढ़े हुए फ़ॉन्ट वाले उपयोगकर्ता कटा हुआ टेक्स्ट, ओवरलैपिंग तत्व और टूटे हुए बटन देखेंगे। ऐप को एक्सेसिबिलिटी आवश्यकताओं के उल्लंघन के लिए App Store समीक्षा में अस्वीकार किया जा सकता है।
सारांश
हम एक मोबाइल एप्लिकेशन टर्नकी विकसित करेंगे
IT Sectr 2017 से स्टार्टअप और व्यवसायों के लिए iOS और Android एप्लिकेशन बनाता है। हम आपको सलाह देंगे और सर्वोत्तम समाधान प्रस्तावित करेंगे।
यह भी पढ़ें