मुख्य बिंदु
Dynamic Type एक Apple तकनीक है जो सिस्टम टेक्स्ट आकार बदलने पर एप्लिकेशन फ़ॉन्ट को स्वचालित रूप से स्केल करने की अनुमति देती है। उपयोगकर्ता सेटिंग्स → एक्सेसिबिलिटी → डिस्प्ले और टेक्स्ट आकार में अपना पसंदीदा आकार निर्धारित करता है, और Dynamic Type का समर्थन करने वाले सभी ऐप बिना पुनरारंभ किए फ़ॉन्ट आकार को अनुकूलित करते हैं।
सिस्टम 11 स्केलिंग स्तर प्रदान करता है: XS (14pt आधार) से XXXL (23pt आधार) तक, साथ ही महत्वपूर्ण दृश्य हानि वाले उपयोगकर्ताओं के लिए 5 अतिरिक्त एक्सेसिबिलिटी आकार (AX1–AX5)। आकार बदलने पर, iOS एक UIContentSizeCategory.didChangeNotification नोटिफिकेशन उत्पन्न करता है, और ऐप को UIFontMetrics के माध्यम से फ़ॉन्ट को पुनः लोड करना होता है। Apple Human Interface Guidelines के अनुसार, Dynamic Type लाइन स्पेसिंग या अक्षर अनुपात नहीं बदलता — केवल फ़ॉन्ट आकार, सभी आकारों पर पठनीयता बनाए रखता है।
Dynamic Type उन ऐप्स के लिए अनिवार्य है जो एक्सेसिबिलिटी स्थिति का लक्ष्य रखते हैं। WWDC 2024 में, Apple ने घोषणा की कि डायनामिक टाइप समर्थन के बिना ऐप्स को समीक्षा में अस्वीकार किए जाने का जोखिम है यदि उनकी मुख्य कार्यक्षमता टेक्स्ट पढ़ने से संबंधित है। IT Sectr परियोजनाओं में, हम पहले संस्करण से Dynamic Type लागू करते हैं — इससे बाद के एक्सेसिबिलिटी अनुकूलन पर 20% तक समय बचता है।
Apple सिस्टम फ़ॉन्ट SF Pro के लिए UIFontDescriptor.UIAttributes के माध्यम से 11 पूर्वनिर्धारित टेक्स्ट शैलियाँ प्रदान करता है। डेवलपर पिक्सेल आकार निर्दिष्ट नहीं करता — वह एक सिमैंटिक शैली चुनता है, और iOS उपयोगकर्ता की सेटिंग्स के आधार पर वास्तविक फ़ॉन्ट आकार लागू करता है।
| शैली | आकार (डिफ़ॉल्ट) | आकार (AX5) | उपयोग |
|---|---|---|---|
| .largeTitle | 34pt | 62pt | प्रथम-स्तरीय स्क्रीन शीर्षक |
| .title1 | 28pt | 50pt | द्वितीयक शीर्षक |
| .title2 | 22pt | 40pt | अनुभाग शीर्षक |
| .title3 | 20pt | 36pt | उपशीर्षक |
| .headline | 17pt semibold | 31pt | सूचियों में हाइलाइट किया गया टेक्स्ट |
| .body | 17pt | 31pt | मुख्य टेक्स्ट |
| .callout | 16pt | 29pt | कॉलआउट और पूरक टेक्स्ट |
| .subheadline | 15pt | 27pt | तत्व लेबल |
| .footnote | 13pt | 23pt | फ़ुटनोट और छोटा टेक्स्ट |
| .caption1 | 12pt | 21pt | छवि कैप्शन |
| .caption2 | 11pt | 19pt | लेबल और छोटे कैप्शन |
प्रत्येक शैली एक निश्चित वजन के साथ सिस्टम फ़ॉन्ट SF Pro का उपयोग करती है (body के लिए Regular, headline के लिए Bold)। कस्टम फ़ॉन्ट UIFontMetrics के माध्यम से जुड़ते हैं — तीसरे पक्ष के फ़ॉन्ट को डायनामिक टाइप में अनुकूलित करने का एकमात्र सही तरीका।
UIFontMetrics एक वर्ग है जो iOS 11 में पेश किया गया था, जो किसी भी UIFont को चयनित टेक्स्ट शैली के अनुपात में स्केल करता है। iOS 11 से पहले, डेवलपर सीधे preferredFontForTextStyle का उपयोग करते थे, जो केवल सिस्टम फ़ॉन्ट SF Pro लौटाता है। UIFontMetrics इस समस्या को हल करता है: यह किसी भी फ़ॉन्ट को लेता है और उसका स्केल किया गया संस्करण लौटाता है, वजन और अनुपात बनाए रखता है।
scaledFont(for:) विधि उपयोगकर्ता के वर्तमान टेक्स्ट आकार के आधार पर एक स्केलिंग कारक की गणना करती है: यदि बड़ा चुना गया है, तो कारक 1.0 है; यदि बहुत बड़ा (AX1) — लगभग 1.3; अधिकतम (AX5) के लिए — 1.8 तक। कारक कस्टम फ़ॉन्ट के आधार आकार पर लागू किया जाता है, सिस्टम पर नहीं — यह सुनिश्चित करता है कि डिज़ाइनर का इरादा सभी आकारों पर संरक्षित रहे।
UIFontMetrics को ऐप में सभी कस्टम फ़ॉन्ट के लिए अनुशंसित किया जाता है। WWDC 2024 में, Apple ने Accessibility Inspector टूल दिखाया, जो Dynamic Type समर्थन की जाँच करता है और UIFontMetrics के बजाय फिक्स्ड फ़ॉन्ट आकार का उपयोग करने वाले तत्वों को हाइलाइट करता है। IT Sectr में, हमने 2018 से सभी परियोजनाओं में UIFontMetrics लागू किया है — इससे टेक्स्ट ओवरलैप बग में 35% की कमी आई है।
लेबल के लिए डायनामिक फ़ॉन्ट प्राप्त करने का सबसे सरल तरीका। कोड दिखाता है कि .body शैली के साथ UILabel कैसे सेट करें जो सिस्टम टेक्स्ट आकार में परिवर्तनों पर स्वचालित रूप से प्रतिक्रिया करता है।
import UIKit
class GreetingViewController: UIViewController {
private let label: UILabel = {
let l = UILabel()
l.text = "Hello, Dynamic Type!"
l.font = UIFont.preferredFont(forTextStyle: .body)
l.adjustsFontForContentSizeCategory = true
l.translatesAutoresizingMaskIntoConstraints = false
return l
}()
override func viewDidLoad() {
super.viewDidLoad()
view.addSubview(label)
NSLayoutConstraint.activate([
label.centerXAnchor.constraint(equalTo: view.centerXAnchor),
label.centerYAnchor.constraint(equalTo: view.centerYAnchor),
])
}
}
adjustsFontForContentSizeCategory = true फ़्लैग सिस्टम टेक्स्ट आकार बदलने पर स्वचालित रूप से फ़ॉन्ट अपडेट करता है — इस फ़्लैग के बिना, Dynamic Type मौजूदा लेबल के लिए काम नहीं करेगा। आकार बदलने पर, iOS layoutIfNeeded को कॉल करता है, और लेबल बिना मैन्युअल हस्तक्षेप के फ़ॉन्ट अपडेट करता है।
कस्टम फ़ॉन्ट (जैसे Montserrat) का उपयोग करते समय, preferredFontForTextStyle को कॉल करने पर SF Pro वापस आएगा, आपका फ़ॉन्ट नहीं। UIFontMetrics विशेष रूप से कस्टम फ़ॉन्ट को स्केल करता है, उसके डिज़ाइन को संरक्षित करता है।
import UIKit
extension UIFont {
static func customDynamicFont(name: String,
size: CGFloat,
style: UIFont.TextStyle) -> UIFont {
guard let baseFont = UIFont(name: name, size: size) else {
return .preferredFont(forTextStyle: style)
}
return UIFontMetrics(forTextStyle: style).scaledFont(for: baseFont)
}
}
let titleFont = UIFont.customDynamicFont(
name: "Montserrat-Bold",
size: 20,
style: .title3
)
scaledFont(for:) विधि एक आधार UIFont लेती है और .title3 शैली के अनुपात में एक स्केल किया गया संस्करण लौटाती है। एक्सेसिबिलिटी आकार AX5 पर, Montserrat-Bold 20pt फ़ॉन्ट ~36pt हो जाता है — बिल्कुल उतना ही जितना इस शैली का सिस्टम फ़ॉन्ट बढ़ेगा। IT Sectr में, हमने 2018 से कस्टम फ़ॉन्ट वाली सभी परियोजनाओं में इस पैटर्न का उपयोग किया है, जिसने दृश्य हानि वाले उपयोगकर्ताओं से छोटे टेक्स्ट की शिकायतों को पूरी तरह से समाप्त कर दिया।
यदि आप मैन्युअल रूप से फ़ॉन्ट अपडेट करते हैं (adjustsFontForContentSizeCategory के बिना), तो UIContentSizeCategory.didChangeNotification नोटिफिकेशन की सदस्यता लें। यह कस्टम UI तत्वों के लिए आवश्यक है जो स्वचालित फ़ॉन्ट अपडेट प्राप्त नहीं करते।
import UIKit
class DynamicLabel: UILabel {
private var customFont: UIFont?
private var textStyle: UIFont.TextStyle = .body
func configure(font: UIFont, style: UIFont.TextStyle) {
customFont = font
textStyle = style
NotificationCenter.default.addObserver(
self,
selector: #selector(updateFont),
name: UIContentSizeCategory.didChangeNotification,
object: nil
)
updateFont()
}
@objc private func updateFont() {
guard let base = customFont else { return }
self.font = UIFontMetrics(forTextStyle: textStyle).scaledFont(for: base)
}
deinit {
NotificationCenter.default.removeObserver(self)
}
}
didChangeNotification की सदस्यता सुनिश्चित करती है कि कस्टम तत्व ऐप को पुनरारंभ किए बिना सिस्टम सेटिंग्स बदलने पर अपने फ़ॉन्ट को अपडेट करता है। iOS 15 के बाद से, नोटिफिकेशन तब भी आता है जब Live Text Size का समर्थन करने वाले ऐप्स में कंट्रोल सेंटर के माध्यम से टेक्स्ट आकार बदला जाता है।
अक्सर पूछे जाने वाले प्रश्न
Dynamic Type iOS 7 और बाद के संस्करणों पर उपलब्ध है। UIFontMetrics iOS 11 में दिखाई दिया — इससे पहले preferredFontForTextStyle विधि का सीधे उपयोग किया जाता था। iOS 15+ पर, डायनामिक टाइप बड़े फ़ॉन्ट के लिए अतिरिक्त एक्सेसिबिलिटी आकार (AX1–AX5) का समर्थन करता है। iOS 10 और उससे नीचे का समर्थन करने वाले ऐप UIFontMetrics के बिना preferredFontForTextStyle का उपयोग करते हैं, जो समर्थन को केवल सिस्टम फ़ॉन्ट SF Pro तक सीमित करता है।
Xcode 15+ में, सिम्युलेटर खोलें और सेटिंग्स → एक्सेसिबिलिटी → डिस्प्ले और टेक्स्ट आकार → बड़ा टेक्स्ट चुनें। आकार बदलने के लिए स्लाइडर खींचें। Xcode में ही, Debug → Accessibility Inspector है, जो फिक्स्ड फ़ॉन्ट वाले तत्वों को हाइलाइट करता है। ऑटोमेशन के लिए, XCUITest के माध्यम से UISlider सेटिंग्स बदलने वाला परीक्षण उपयोग करें — यह सुनिश्चित करता है कि सभी स्क्रीन सही ढंग से पुनर्निर्माण करें।
हाँ, डायनामिक टाइप के साथ Auto Layout को UILabel और UIButton पर intrinsicContentSize के उपयोग की आवश्यकता होती है। एक्सेसिबिलिटी आकारों पर, टेक्स्ट superview सीमा से बाहर निकल सकता है — UIScrollView जोड़ें या leading/trailing कंस्ट्रेंट बढ़ाएँ। पैडिंग के लिए UIFontMetrics.scaledValue का उपयोग करें, ताकि अक्षर स्पेसिंग भी फ़ॉन्ट के अनुपात में स्केल हो।
सारांश
हम एक मोबाइल एप्लिकेशन टर्नकी विकसित करेंगे
IT Sectr 2017 से स्टार्टअप और व्यवसायों के लिए iOS और Android एप्लिकेशन बनाता है। हम आपको सलाह देंगे और सर्वोत्तम समाधान प्रस्तावित करेंगे।
यह भी पढ़ें