Dynamic Type iOS کا ایک بلٹ‐ان فیچر ہے جو صارف کے سسٹم فونٹ سائز کی ترتیبات کے مطابق ایپ میں فونٹ کا سائز خود بخود تبدیل کرتا ہے۔ صارف ترتیبات → ڈسپلے اور چمک → ٹیکسٹ سائز میں مطلوبہ ٹیکسٹ سائز سیٹ کرتا ہے، اور Dynamic Type کو سپورٹ کرنے والی تمام ایپس بغیر کسی اضافی اقدامات کے خود بخود ڈھل جاتی ہیں۔ Apple Human Interface Guidelines, 2024 کے مطابق، Dynamic Type کی حمایت App Store میں شائع ہونے کے لیے لازمی شرط ہے، کیونکہ یہ iOS پلیٹ فارم پر accessibility کا بنیادی عنصر ہے۔
اہم نکات
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 iOS 7 میں “فلیٹ” ڈیزائن کے ساتھ متعارف ہوا۔ iOS 10 میں UIFontMetrics کے ذریعے کسٹم فونٹس کی حمایت شامل کی گئی۔ iOS 11 نے accessibility لیولز (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 (bold) | زور دینے کے لیے بولڈ |
| 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 سے بڑا ہوتا ہے، اسکیلنگ کی سطح سے قطع نظر۔ اسکیلنگ کے تناسب مختلف ہوتے ہیں: عنوانات بنیادی متن سے زیادہ اسکیل ہوتے ہیں تاکہ accessibility لیولز پر بھی درجہ بندی برقرار رہے۔
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 استعمال کریں — یہ خود بخود کالموں کی تعداد کو اسکرین کی چوڑائی اور ٹیکسٹ سائز کے مطابق ڈھال لیتا ہے۔ accessibility لیولز پر دو کالموں والے لے آؤٹ سے سنگل کالم لے آؤٹ پر سوئچ کریں تاکہ متن کٹے نہیں اور عناصر ایک دوسرے پر نہ چڑھیں۔ conditional layout استعمال کریں: regular width کے لیے دو کالم، compact یا accessibility کے لیے ایک کالم۔
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
)
UILabel کے لیے Interface Builder میں فونٹ کو ٹیکسٹ اسٹائل (Text Style) کے طور پر سیٹ کرنا اور “Automatically Adjusts Font” کو فعال کرنا کافی ہے۔ کسٹم فونٹس کے لیے IB 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 کی حمایت کے لیے لازمی شرط ہے۔ طے شدہ چوڑائیاں اور اونچائیاں (>=, <=) accessibility سائزز پر ٹوٹ جاتی ہیں۔ 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۔ عناصر کا اوورلیپ — طے شدہ اونچائی والے بٹن ایک دوسرے پر چڑھ جاتے ہیں۔ حل: automatic spacing کے ساتھ UIStackView۔ اسکرین کی حدود سے باہر نکلنا — accessibility لیولز کے لیے ScrollView لازمی ہے۔
Xcode Simulator ٹیکسٹ سائز تبدیل کرنے کی اجازت دیتا ہے: سمیلیٹر مینو 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))
}
XCUITest مختلف launchArguments کے ساتھ CI میں اسکیلنگ کے تمام لیولز چیک کرنے کی اجازت دیتا ہے۔ accessibility کیٹیگریز کو علیحدہ چیک کرنا نہ بھولیں — یہ اکثر لے آؤٹ توڑتی ہیں۔ Apple کے مطابق، Dynamic Type کے 70% بگز accessibility لیولز پر پائے جاتے ہیں کیونکہ ڈویلپر صرف معیاری سائزز کی جانچ کرتے ہیں۔
Xcode Accessibility Inspector دکھاتا ہے کہ منتخب عنصر کون سے فونٹ استعمال کر رہا ہے — طے شدہ یا اسکیل ایبل۔ اگر عنصر سمیلیٹر میں ٹیکسٹ سائز کی تبدیلی پر ردعمل نہیں دیتا، تو طے شدہ فونٹ استعمال ہو رہا ہے۔ اسے UIFont.preferredFont یا UIFontMetrics سے تبدیل کریں۔
اکثر پوچھے گئے سوالات
یہ سسٹم فونٹ سائز کی ترتیبات کے مطابق ایپ میں متن کا خودکار اسکیلنگ ہے۔ صارف ترتیبات میں سائز تبدیل کرتا ہے — تمام معاون ایپس بغیر ڈویلپر کی مداخلت کے ڈھل جاتی ہیں۔
نہیں۔ کسٹم فونٹس کے لیے UIFontMetrics(scaledFont:) استعمال کریں۔ یہ طریقہ کسی بھی فونٹ کو مخصوص ٹیکسٹ اسٹائل کے نسبت اسکیل کرتا ہے، تناسب برقرار رکھتے ہوئے۔
11 لیولز: 5 معیاری (XS, S, M, L, XL) اور 6 accessibility لیولز (AccessibilityXL سے AccessibilityXXXXXL تک)۔ body فونٹ کا سائز 14px سے 53px تک مختلف ہو سکتا ہے۔
UIKit میں UIContentSizeCategory.didChangeNotification کے ذریعے۔ SwiftUI میں @Environment(\.dynamicTypeSize) استعمال کریں — سسٹم ترتیب تبدیل ہونے پر ویو خود بخود اپ ڈیٹ ہو جائے گا۔
بڑھے ہوئے فونٹ والے صارفین کٹا ہوا متن، اوورلیپنگ عناصر اور ناکارہ بٹن دیکھیں گے۔ ایپ کو accessibility تقاضوں کی خلاف ورزی پر App Store Review پر مسترد کیا جا سکتا ہے۔
خلاصہ
ہم ایک موبائل ایپلیکیشن ٹرنکی تیار کریں گے
IT Sectr 2017 سے اسٹارٹ اپس اور کاروبار کے لیے iOS اور Android ایپلیکیشنز بناتا ہے۔ ہم آپ کو مشورہ دیں گے اور بہترین حل تجویز کریں گے۔
مزید پڑھیں