Font Descriptor iOS میں UIFontDescriptor اور macOS میں NSFontDescriptor آبجیکٹ ہے جو تمام فونٹ میٹا ڈیٹا کو سمیٹتا ہے: خاندان، ٹائپ فیس، سائز، حرفوں کا فاصلہ، سطروں کا فاصلہ اور طباعتی خصوصیات۔ براہ راست UIFont(name:size:) کے ذریعے فونٹ بنانے کے بجائے، ڈویلپر ڈسکرپٹر کے ذریعے مطلوبہ خصوصیات بیان کرتا ہے اور سسٹم دستیاب فونٹس میں سے بہترین مماثلت منتخب کرتا ہے۔ Apple ڈویلپر دستاویزات کے مطابق، UIFontDescriptor 20 سے زیادہ فونٹ خصوصیات کو سپورٹ کرتا ہے اور تمام iOS طباعتی فریم ورکس — UIKit سے Core Text اور SwiftUI تک — میں استعمال ہوتا ہے۔
اہم نکات
Font Descriptor ایک آبجیکٹ ہے جو کسی مخصوص فونٹ فائل کے بجائے کلید-قدر جوڑوں کے سیٹ کے طور پر فونٹ کی خصوصیات بیان کرتا ہے۔ نام سے فونٹ بنانے کے بجائے، ڈویلپر خاندان، ٹائپ فیس، سائز اور اختیاری صفات بتاتا ہے اور سسٹم بہترین مماثلت منتخب کرتا ہے۔ یہ نقطہ نظر انکولی طباعت کے لیے اہم ہے: ایک ہی ڈسکرپٹر مختلف iOS ورژنز پر کام کر سکتا ہے جہاں دستیاب فونٹس کا سیٹ مختلف ہوتا ہے۔ iOS ہیومن انٹرفیس گائیڈ لائنز کے مطابق، ڈسکرپٹرز کے ذریعے فونٹ مماثلت متحرک فونٹس کے ساتھ کام کرنے کا تجویز کردہ طریقہ ہے۔
Font Descriptor کے بغیر، ڈویلپرز کو ہر فونٹ کی دستیابی نام سے جانچنی پڑتی اور دستی طور پر فال بیک آپشنز متعین کرنے پڑتے۔ ڈسکرپٹر اس عمل کو خودکار کرتا ہے: اس میں ٹائپ فیسز کی مطابقت میٹرکس (عام، بولڈ، اٹالک، بولڈ اٹالک) ہوتی ہے اور جب صحیح مماثلت نہیں ملتی، تو یہ قریب ترین دستیاب مماثلت لوٹاتا ہے۔ سسٹم مماثلت Core Text کی سطح پر کام کرتی ہے اور متحد NSFontDescriptor API کے ذریعے iOS اور macOS دونوں پر دستیاب ہے۔
ڈسکرپٹرز حسب ضرورت فونٹس — Info.plist کے ذریعے لوڈ کردہ یا دستی طور پر شامل کردہ — کے لیے بھی استعمال ہوتے ہیں۔ اگر کوئی فونٹ سسٹم میں رجسٹرڈ ہے، تو اس کا ڈسکرپٹر سسٹم فونٹ کی طرح ہی بنایا جاتا ہے۔ کراس پلیٹ فارم نوٹ: ڈسکرپٹر کا تصور Android میں Typeface.Builder کے ذریعے بھی موجود ہے، لیکن UIFontDescriptor کے ذریعے iOS نفاذ نمایاں طور پر زیادہ صفات فراہم کرتا ہے — Android میں 5 کے مقابلے میں 20 سے زیادہ۔
UIFontDescriptor میں [UIFontDescriptor.AttributeName: Any] قسم کی fontAttributes ڈکشنری میں گروپ کردہ صفات ہوتی ہیں۔ اہم صفات میں فونٹ خاندان، نام، سائز، خصائص (traits)، تبدیلی میٹرکس، بصری سائز اور متن کا اسٹائل شامل ہیں۔ Apple WWDC 2019 سیشن 227 کے مطابق، متن کے اسٹائل — Dynamic Type — کا استعمال رسائی مطابقت رکھنے والی ایپلی کیشنز کے لیے لازمی ہے۔
traits صفت ایک ڈکشنری ہے جس میں علامتی خصوصیات ہوتی ہیں: وزن (UIFontWeightTrait)، جھکاؤ (UIFontSlantTrait)، چوڑائی (UIFontWidthTrait) اور دیگر۔ یہ قدریں فونٹ مماثل کنندہ ٹائپ فیس منتخب کرنے کے لیے استعمال کرتا ہے۔ مثال کے طور پر، UIFontWeightTrait قدر 0.0 — عام ٹائپ فیس، 0.3 — بولڈ۔ سسٹم خودکار طور پر عددی قدروں کو دستیاب فونٹ متغیرات سے جوڑتا ہے۔
اضافی صفات میں OpenType خصوصیات کے لیے featureSettings (لیگیچرز، کرننگ، عددی تناسب)، صارف کو ظاہر کرنے کے لیے visibleName، فونٹ کی ایفائن تبدیلی کے لیے matrix اور جھرن دار فال بیک فونٹ فہرستوں کے لیے cascadeList شامل ہیں۔ صفات کی مکمل فہرست iOS اور macOS میں تقریباً تمام طباعتی منظرناموں کا احاطہ کرتی ہے۔
| صفت | قسم | وضاحت |
|---|---|---|
| UIFontDescriptorFamily | String | فونٹ خاندان (SF Pro, Helvetica Neue) |
| UIFontDescriptorName | String | فونٹ کا مکمل نام (HelveticaNeue-Bold) |
| UIFontDescriptorSize | NSNumber | پوائنٹس میں فونٹ کا سائز |
| UIFontDescriptorMatrix | NSValue | ایفائن تبدیلی میٹرکس |
| UIFontDescriptorTraits | [String: Any] | ٹائپ فیس کی علامتی خصوصیات |
| UIFontDescriptorTextStyle | String | Dynamic Type اسٹائل (headline, body, caption) |
iOS میں Font Descriptor کے ساتھ کام کرنے کا بنیادی طریقہ ڈسکرپٹر بنانا اور پھر اس سے UIFont تیار کرنا ہے۔ یہ ترجیحی طریقہ ہے جب آپ کو صحیح نام جانے بغیر مخصوص خصوصیات والے فونٹ کی ضرورت ہو۔ عمل دو مراحل پر مشتمل ہے: ایک انیشیالائزر کے ذریعے UIFontDescriptor بنانا اور ڈسکرپٹر پر font(withSize:) طریقہ کال کرنا۔
import UIKit
// خاندان کے لیے فونٹ ڈسکرپٹر بنائیں
let descriptor = UIFontDescriptor.init(
fontAttributes: [
.family: "SF Pro",
.traits: [
.weight: UIFont.Weight.bold
]
]
)
// ڈسکرپٹر سے UIFont تیار کریں
let font = descriptor.font(withSize: 17)
یہ طریقہ یقینی بناتا ہے کہ سسٹم موجودہ ڈیوائس پر SF Pro کے بولڈ ٹائپ فیس کے لیے بہترین مماثلت منتخب کرے۔ اہم فائدہ — کوڈ iOS ورژن پر منحصر نہیں ہے: iOS 13 پر SF Pro استعمال ہوگا؛ پرانے ورژنز پر Helvetica Neue یا ڈیفالٹ سسٹم فونٹ۔
متحرک سائز والا فونٹ بنانے کے لیے، متن کے اسٹائل اور پیمانے کے ساتھ انیشیالائزر استعمال کریں۔ Dynamic Type صارف کی ترتیبات کے مطابق خود بخود سائز ایڈجسٹ کرتا ہے:
// Dynamic Type ڈسکرپٹر
let bodyDescriptor = UIFontDescriptor
.preferredFontDescriptor(withTextStyle: .body)
// فونٹ بولڈ بنائیں
let boldDescriptor = bodyDescriptor.withSymbolicTraits([.traitBold])
// متحرک سائز محفوظ رکھتے ہوئے UIFont تیار کریں
let boldBodyFont = UIFont(
descriptor: boldDescriptor!,
size: bodyDescriptor.pointSize
)
اہم: withSymbolicTraits طریقہ ایک اختیاری ڈسکرپٹر لوٹاتا ہے — اگر درخواست کردہ ٹائپ فیس دستیاب نہیں ہے، تو یہ nil لوٹاتا ہے۔ استعمال سے پہلے ہمیشہ اختیاری کو چیک کریں۔
Font Descriptor ایک ناقابل تبدیلی ماڈل کو سپورٹ کرتا ہے — ہر ترمیم کا طریقہ تبدیل شدہ صفت کے ساتھ ایک نیا ڈسکرپٹر لوٹاتا ہے۔ یہ قدری معنویات کی پیروی کرتا ہے اور کوڈ کو پیش قیاس بناتا ہے: اصل ڈسکرپٹر کبھی نہیں بدلتا۔ اہم ترمیمی طریقے یہ ہیں: صفات شامل کرنے کے لیے addingAttributes، ٹائپ فیس تبدیل کرنے کے لیے withFace، سائز تبدیل کرنے کے لیے withSize اور ایفائن تبدیلی کے لیے withMatrix۔
addingAttributes طریقہ سب سے لچکدار ہے۔ یہ صفات کی ایک ڈکشنری لیتا ہے اور ایک نیا ڈسکرپٹر لوٹاتا ہے۔ جب کنجیاں مماثل ہوتی ہیں، نئی قدریں پرانی کو بدل دیتی ہیں۔ یہ ایک کال میں وزن شامل کرنے، سائز تبدیل کرنے اور لیگیچرز کو فعال کرنے جیسی تبدیلیوں کو یکجا کرنے کی اجازت دیتا ہے۔ Apple تکنیکی سوال و جواب QA1682 کے مطابق، addingAttributes ایکسٹینشن کے ذریعے بڑی تبدیلی کا تجویز کردہ طریقہ ہے۔
عملی استعمال کی صورت: کوڈ ایڈیٹر میں یک فاصلہ متن کے لیے فونٹ بنانا۔ ڈویلپر سسٹم یک فاصلہ ڈسکرپٹر لیتا ہے، پتلی لکیروں کے لیے کم وزن شامل کرتا ہے اور featureSettings کے ذریعے حرفی فاصلہ بڑھاتا ہے۔ یہ علیحدہ فونٹ لوڈ کیے بغیر مزید پڑھنے کے قابل کوڈ فراہم کرتا ہے۔
let monoDescriptor = UIFontDescriptor.monospacedDigitFontDescriptor()
// حسب ضرورت صفات شامل کریں
let customDescriptor = monoDescriptor.addingAttributes([
.size: 14,
.traits: [
.weight: UIFont.Weight.medium
]
])
let monoFont = UIFont(
descriptor: customDescriptor,
size: 14
)
حدود: ڈسکرپٹر بنانے کے بعد تمام صفات تبدیل نہیں کی جا سکتیں۔ مثال کے طور پر، فونٹ خاندان انیشیالائزیشن کے دوران ایک بار مقرر کیا جاتا ہے۔ اگر آپ کو خاندان تبدیل کرنے کی ضرورت ہے، تو نیا ڈسکرپٹر بنائیں۔ اس کا تعلق Core Text آرکیٹیکچر سے ہے، جہاں ڈسکرپٹر ایک مخصوص فونٹ وسائل سے منسلک ہوتا ہے۔
فونٹ مماثلت Font Descriptor کی ایک اہم خصوصیت ہے جو انسٹال کردہ فونٹس میں سے درخواست کردہ صفات کے لیے خود بخود بہترین مماثلت منتخب کرتی ہے۔ عمل تین مراحل پر مشتمل ہے: فلٹرنگ (غیر مطابقت پذیر فونٹس کو خارج کرنا)، درجہ بندی (مماثلت کی ڈگری کے مطابق ترتیب دینا)، اور انتخاب (بہترین نتیجہ لوٹانا)۔ مماثلت Core Text کی سطح پر انجام دی جاتی ہے — فریم ورک جو تمام iOS طباعت کی بنیاد ہے۔
ڈسکرپٹر سے مماثل تمام فونٹس تلاش کرنے کے لیے، matchingFontDescriptors طریقہ استعمال کریں۔ یہ متعلقہ کے مطابق ترتیب شدہ ڈسکرپٹرز کی ایک صف لوٹاتا ہے۔ ڈویلپر عین مماثلت (پہلا عنصر) منتخب کر سکتا ہے یا حسب ضرورت منطق کے لیے اختیارات پر گھوم سکتا ہے۔ Apple فونٹ ہینڈلنگ گائیڈ کے مطابق، نام سے گنتی کیے بغیر کسی مخصوص خاندان کے لیے دستیاب ٹائپ فیسز کی فہرست حاصل کرنے کا یہ واحد طریقہ ہے۔
استعمال کی صورت: متن کی ترتیبات کے انٹرفیس میں فونٹ منتخب کرتے وقت۔ صارف ایک خاندان چنتا ہے اور ایپلی کیشن تمام دستیاب ٹائپ فیسز حاصل کرنے اور انہیں چنندہ میں ظاہر کرنے کے لیے matchingFontDescriptors استعمال کرتی ہے۔ مماثلت کے بغیر، ڈویلپرز کو iOS ورژنز کے درمیان تبدیل ہونے والے اختیارات کی فہرست سخت رمز کرنی پڑتی۔
let searchDescriptor = UIFontDescriptor.init(
fontAttributes: [.family: "SF Mono"]
)
// تمام دستیاب ٹائپ فیسس حاصل کریں
let matchingDescriptors = searchDescriptor
.matchingFontDescriptors(withMandatoryKeys: nil)
for descriptor in matchingDescriptors {
print(descriptor.object(forKey: .visibleName) ?? "unnamed")
}
لازمی کنجیاں — ایک پیرامیٹر جو تلاش کو محدود کرتا ہے۔ اگر آپ [.family] بتاتے ہیں، مماثلت مخصوص خاندان کے تمام فونٹس لوٹاتی ہے۔ اگر آپ [.family, .traits] بتاتے ہیں — صرف وہ جو خاندان اور ٹائپ فیس دونوں سے مماثل ہوں۔ لازمی کنجیوں کا استعمال فونٹس کے ذیلی سیٹ کی تلاش کرتے وقت مماثلت کو تیز کرتا ہے۔
کارکردگی: مماثلت ایک ہم وقت عمل ہے جو iOS پر 0.5 سے 5 ملی سیکنڈ لیتا ہے۔ ایک تلاش کے لیے یہ نہ ہونے کے برابر ہے، لیکن ڈسکرپٹرز پر بڑی مقدار میں گشت کے لیے (مثلاً، 50+ فونٹس والے چنندہ میں)، نتائج کو کیش کرنے کی سفارش کی جاتی ہے۔ Apple اسکرین لوڈ کرتے وقت ایک بار مماثلت کرنے اور ڈسکرپٹرز کی صف محفوظ کرنے کی سفارش کرتا ہے۔
Core Text iOS اور macOS پر طباعت کے ساتھ کام کرنے کے لیے ایک نچلی سطح کا C-based فریم ورک ہے۔ UIFontDescriptor کا اس کا ہم منصب CTFontDescriptor ہے، جو Core Foundation کی سطح پر وہی صلاحیتیں فراہم کرتا ہے۔ CTFontDescriptor Core Text APIs میں فونٹس بنانے، متن ناپنے اور پیچیدہ طباعت پیش کرنے کے لیے استعمال ہوتا ہے۔ UIFontDescriptor بنیادی طور پر توسیع شدہ صفات کے سیٹ کے ساتھ CTFontDescriptor کے گرد ایک Objective-C ریپر ہے۔
UIFontDescriptor اور CTFontDescriptor کے درمیان ٹول فری برجنگ تبدیلی کے بغیر UIKit اور Core Text کے درمیان ڈسکرپٹرز منتقل کرنے کی اجازت دیتی ہے۔ یہ ان ایپلی کیشنز کے لیے اہم ہے جو حسب ضرورت متن پیش کرتی ہیں — مثال کے طور پر، TextKit پر مبنی ٹیکسٹ ایڈیٹرز یا نحو کو نمایاں کرنے والے کوڈ ایڈیٹرز۔ مثال: CTFontDescriptorCreateCopyWithAttribute شامل کردہ صفت کے ساتھ ڈسکرپٹر کی ایک نقل بناتا ہے — UIFontDescriptor کے addingAttributes کا ایک مشابہ۔
CTFontDescriptor میں اہم صفت kCTFontURLAttribute فونٹ فائل کا URL رکھتی ہے۔ یہ تعین کرنے کی اجازت دیتی ہے کہ فونٹ سسٹم ہے یا حسب ضرورت۔ حسب ضرورت فونٹس کے لیے، URL فونٹ فائل (.ttf یا .otf) کی طرف اشارہ کرتا ہے؛ سسٹم فونٹس کے لیے — سسٹم فونٹ ڈائریکٹری کی طرف۔ ڈسکرپٹر کے ذریعے ڈیٹا صرف پڑھنے کے لیے ہے؛ URL کے ذریعے فونٹ فائل میں ترمیم معاون نہیں ہے۔
اعلیٰ طباعت — حسب ضرورت لیگیچرز، سیاقی تبدیلیاں، متبادل گلائف — کے لیے kCTFontFeatureSettingsAttribute کلید کے ساتھ CTFontDescriptorCopyAttribute استعمال کریں۔ اس صفت میں OpenType خصوصیات کی ڈکشنریوں کی ایک صف ہوتی ہے جسے ڈسکرپٹر کے ذریعے شامل کیا جا سکتا ہے۔ Apple Core Text پروگرامنگ گائیڈ کے مطابق، UIFontDescriptor کو Core Text کے ساتھ جوڑنا ایپلی کیشن کی طباعت پر مکمل کنٹرول دیتا ہے۔
اکثر پوچھے گئے سوالات
UIFont ایک استعمال کے لیے تیار فونٹ ہے جو متن پیش کرتا ہے۔ Font Descriptor ایک فونٹ وضاحت ہے — صفات کا ایک سیٹ جس سے UIFont بنایا جا سکتا ہے۔ ایک ڈسکرپٹر مختلف سائز کے متعدد UIFonts پیدا کر سکتا ہے۔
ہاں۔ اگر فونٹ سسٹم میں رجسٹرڈ ہے (Info.plist یا Core Graphics کے ذریعے)، تو اس کا ڈسکرپٹر سسٹم فونٹس کی طرح خاندان یا نام سے بنایا جاتا ہے۔ مماثلت کسی بھی رجسٹرڈ فونٹ کے لیے کام کرتی ہے۔
ظاہری نام حاصل کرنے کے لیے descriptor.object(forKey: .visibleName) یا PostScript نام کے لیے descriptor.postscriptName استعمال کریں۔ PostScript نام UIFont(name:size:) کے ذریعے فونٹ بناتے وقت استعمال ہوتا ہے۔
جھرن دار فہرست اندرونی ڈسکرپٹرز کی ایک صف ہے جو فال بیک فونٹس کے طور پر کام کرتی ہے۔ اگر بنیادی فونٹ میں مطلوبہ حرف نہیں ہے، تو سسٹم جھرن دار فہرست سے ترتیب وار فونٹس چیک کرتا ہے۔ یہ ایموجی اور CJK حروف کی معاونت کے لیے استعمال ہوتی ہے۔
ہاں۔ SwiftUI Font(descriptor:size:) کے ذریعے Font Descriptor کو سپورٹ کرتا ہے۔ SwiftUI ریپر UIFontDescriptor قبول کرتا ہے اور تمام ڈسکرپٹر صفات — کرننگ، لیگیچرز اور ٹائپ فیس — کو محفوظ رکھتے ہوئے SwiftUI فونٹ بناتا ہے۔
خلاصہ
ہم ایک موبائل ایپلیکیشن ٹرنکی تیار کریں گے
IT Sectr 2017 سے اسٹارٹ اپس اور کاروبار کے لیے iOS اور Android ایپلیکیشنز بناتا ہے۔ ہم آپ کو مشورہ دیں گے اور بہترین حل تجویز کریں گے۔
مزید پڑھیں