اہم نکات
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 ایپلیکیشنز بناتا ہے۔ ہم آپ کو مشورہ دیں گے اور بہترین حل تجویز کریں گے۔
مزید پڑھیں