UIFont اور CTFont iOS میں فونٹس کے ساتھ کام کرنے کے لیے کلاسز ہیں: UILabel اور UITextView میں اعلیٰ سطحی متن کی تشکیل کے لیے UIKit کا UIFont، گلائف اور میٹرکس پر مکمل کنٹرول کے ساتھ نچلی سطحی رینڈرنگ کے لیے Core Text کا CTFont۔ Apple Developer Documentation کے مطابق، UIFont 90% معیاری UI اجزاء میں استعمال ہوتا ہے، جبکہ CTFont حسب ضرورت ٹیکسٹ انجنوں اور ایڈیٹرز میں استعمال ہوتا ہے۔ دونوں کلاسز ایک ہی فونٹ کو پیش کرتی ہیں لیکن تجرید کی مختلف سطحوں پر۔
اہم نکات
UIFont ایک UIKit کلاس ہے جو UI اجزاء (UILabel، UITextView، UITextField) میں متن دکھانے کے لیے فونٹ کی نمائندگی کرتی ہے۔ یہ مخصوص سائز، وزن اور اسٹائل کے ساتھ سسٹم اور حسب ضرورت فونٹس حاصل کرنے کے لیے ایک سادہ انٹرفیس فراہم کرتی ہے۔ UIFont کرننگ، لیگیچر اور OpenType خصوصیات پر براہ راست کنٹرول نہیں دیتا — اس کے لیے Core Text استعمال کیا جاتا ہے۔
CTFont ایک Core Text قسم (CTFontRef) ہے جو فونٹ ڈیٹا تک نچلی سطحی رسائی فراہم کرتی ہے۔ CTFont رینڈرنگ کے لیے براہ راست Core Graphics کے ساتھ کام کرتا ہے، متبادل گلائف، لیگیچر اور متغیر فونٹس سمیت تمام OpenType اور TrueType خصوصیات کو سپورٹ کرتا ہے۔ CTFont اندرونی طور پر UIKit کے ذریعے UIFont کو رینڈر کرنے کے لیے استعمال ہوتا ہے لیکن حسب ضرورت ڈرائنگ کے لیے براہ راست بھی دستیاب ہے۔
UIFont اور CTFont Toll-Free Bridging کو سپورٹ کرتے ہیں — بغیر کسی اضافی لاگت کے اقسام کے درمیان تبدیلی۔ Swift اور Objective-C میں UIFont کو CTFont یا CTFont کو UIFont میں کاسٹ کرنا ممکن ہے۔ یہ فونٹ ڈیٹا کو کاپی کیے بغیر ترتیب کے لیے اعلیٰ سطحی UIKit API اور رینڈرنگ کے لیے نچلی سطحی Core Text استعمال کرنے کی اجازت دیتا ہے۔
دونوں کلاسز فونٹ کی خصوصیات (نام، سائز، وزن، اسٹائل، تبدیلی میٹرکس) بیان کرنے کے لیے UIFontDescriptor (UIKit) / CTFontDescriptor (Core Text) استعمال کرتی ہیں۔ ڈسکرپٹر صفات کی ایک لغت ہے جسے موجودہ فونٹس کی بنیاد پر نئے فونٹس بنانے کے لیے تبدیل کیا جا سکتا ہے۔ مثال کے طور پر، ڈسکرپٹر میں traitItalic شامل کریں اور اسی فونٹ کا ترچھا ورژن حاصل کریں۔
UIFont فونٹس بنانے کے لیے کئی فیکٹری طریقے فراہم کرتا ہے۔ systemFont(ofSize:) سسٹم فونٹ San Francisco (iOS) یا Helvetica (پرانے ورژن) لوٹاتا ہے۔ boldSystemFont، italicSystemFont — مخصوص اسٹائل والے variants۔ preferredFont(forTextStyle:) دیے گئے اسٹائل کے لیے Dynamic Type فونٹ لوٹاتا ہے: .headline، .body، .caption1، .footnote۔ سسٹم میں متن کے سائز کی ترتیبات تبدیل ہونے پر یہ فونٹس خود بخود اسکیل ہو جاتے ہیں۔
حسب ضرورت فونٹس لوڈ کرنے کے لیے، فونٹ کے PostScript نام کے ساتھ UIFont(name:size:) استعمال کیا جاتا ہے۔ فونٹ کو پہلے Info.plist میں شامل کیا جانا چاہیے اور ایپ بنڈل میں شامل ہونا چاہیے۔ Apple کے مطابق، تمام معیاری UI اجزاء کے لیے UIFont استعمال کرنے اور صرف حسب ضرورت رینڈرنگ کی ضرورت ہونے پر CTFont پر سوئچ کرنے کی سفارش کی جاتی ہے۔
Dynamic Type iOS 7 میں متعارف کرایا گیا ایک انکولی فونٹ سسٹم ہے۔ صارف ترتیبات میں اپنا ترجیحی متن کا سائز منتخب کرتا ہے — انتہائی چھوٹے سے انتہائی بڑے تک۔ UIFont.preferredFont خود بخود مناسب سائز کا فونٹ لوٹاتا ہے۔ درست آپریشن کے لیے، تمام UILabel میں adjustsFontForContentSizeCategory = true ہونا چاہیے۔ Dynamic Type رسائی کی تعمیل کے لیے لازمی ہے۔
UIFontDescriptor شروع سے نیا نمونہ بنائے بغیر فونٹ کی صفات کو تبدیل کرنے کی اجازت دیتا ہے۔ طریقے addingAttributes(_:)، withSymbolicTraits(_:)، withFamily(_:) تبدیل شدہ پیرامیٹرز کے ساتھ ایک نیا ڈسکرپٹر لوٹاتے ہیں۔ یہ فونٹ variants حاصل کرنے کے لیے آسان ہے: PostScript نام جانے بغیر سسٹم فونٹ میں traitBold شامل کریں اور بولڈ ورژن حاصل کریں۔
CTFont (CTFontRef) نچلی سطحی فونٹ کام کے لیے ایک Core Text قسم ہے۔ یہ CTFontCreateWithName، CTFontCreateWithFontDescriptor، CTFontCreateCopyWithAttributes کے ذریعے بنایا جاتا ہے۔ ہر فنکشن مخصوص انٹرفیس، سائز اور اختیاری صفات کے ساتھ ایک فونٹ لوٹاتا ہے۔ CTFont drawRect کے ذریعے حسب ضرورت UIView پر متن رینڈر کرنے کے لیے Core Graphics میں استعمال ہوتا ہے۔
CTFont ان میٹرکس تک رسائی فراہم کرتا ہے جو UIFont میں دستیاب نہیں ہیں: CTFontGetGlyphsForCharacters دیئے گئے حروف کے لیے گلائف کی ایک صف لوٹاتا ہے، CTFontGetAdvancesForGlyphs — ہر گلائف کی چوڑائی، CTFontGetBoundingBox — گلائف کی حدود۔ یہ حسب ضرورت متن کے لے آؤٹ بنانے کے لیے ضروری ہے: کالم، گردش، ریپنگ۔
CTFontGetAscent، CTFontGetDescent، CTFontGetLeading عمودی فونٹ میٹرکس لوٹاتے ہیں۔ CTFontGetUnitsPerEm — فی ایم-مربع اکائیوں کی تعداد، تناسب کے حساب کے لیے استعمال ہوتی ہے۔ CTFontGetGlyphCount — فونٹ میں کل گلائف کی تعداد۔ یہ ڈیٹا پرنٹ ٹائپوگرافی اور حسب ضرورت لے آؤٹ کے لیے اہم ہے جہاں ہر حرف کی درست پوزیشننگ کی ضرورت ہوتی ہے۔
CTFont OpenType خصوصیات کو سپورٹ کرتا ہے: CTFontCopyFeatures دستیاب فونٹ فنکشنز (لیگیچر، متبادل حروف، کرننگ) کی ایک لغت لوٹاتا ہے، CTFontEnableFeature کسی مخصوص آپشن کو فعال کرتا ہے۔ متغیر فونٹس CTFontCopyVariation اور CTFontCreateCopyWithVariation کے ذریعے ترتیب دیے جاتے ہیں، جو weight، width اور slant کو مسلسل رینج میں تبدیل کرنے کی اجازت دیتے ہیں۔
Swift میں UIFont بنانا فیکٹری طریقوں میں سے کسی ایک کے ذریعے یا نام سے براہ راست ابتدا کے ذریعے کیا جاتا ہے۔ سب سے عام طریقہ سسٹم فونٹس کے لیے systemFont(ofSize:weight:) یا Dynamic Type کے لیے preferredFont(forTextStyle:) ہے۔ حسب ضرورت فونٹس کے لیے، PostScript نام بتا کر UIFont(name:size:) استعمال کیا جاتا ہے۔
UIFont.systemFont(ofSize:weight:) UIFont.Weight قبول کرتا ہے — .ultraLight سے .black تک۔ یہ طریقہ متعلقہ وزن کے ساتھ San Francisco سسٹم فونٹ لوٹاتا ہے۔ UIFont.monospacedSystemFont، UIFont.monospacedDigitSystemFont کوڈ اور نمبروں کے لیے یکساں فاصلہ والے فونٹس لوٹاتے ہیں۔ تمام سسٹم فونٹس خود بخود Dynamic Type کو سپورٹ کرتے ہیں۔
let regularFont = UIFont.systemFont(ofSize: 16, weight: .regular)
let boldFont = UIFont.systemFont(ofSize: 16, weight: .bold)
let headlineFont = UIFont.preferredFont(forTextStyle: .headline)
let monoFont = UIFont.monospacedSystemFont(ofSize: 14, weight: .regular)
label.font = headlineFont
ہر فونٹ براہ راست UILabel کی font پراپرٹی کو تفویض کیا جا سکتا ہے یا NSFontAttributeName کے ذریعے NSAttributedString میں استعمال کیا جا سکتا ہے۔ سسٹم فونٹس iOS کے ذریعے کیش کیے جاتے ہیں، لہٰذا سسٹم فونٹ کو دوبارہ بنانے سے کوئی اضافی بوجھ نہیں پڑتا۔
حسب ضرورت فونٹ استعمال کرنے کے لیے، TTF یا OTF فائل کو پروجیکٹ بنڈل میں شامل کریں اور اسے Info.plist (UIAppFonts) میں بتائیں۔ فونٹ کا PostScript نام UIFont.familyNames اور UIFont.fontNames(forFamilyName:) کے ذریعے معلوم کیا جا سکتا ہے۔ رجسٹریشن کے بعد، فونٹ ایپ میں کہیں سے بھی UIFont(name:size:) کے ذریعے دستیاب ہوتا ہے۔
// تمام فونٹ خاندانوں کے نام حاصل کریں
for family in UIFont.familyNames {
let names = UIFont.fontNames(forFamilyName: family)
print("\(family): \(names)")
}
// حسب ضرورت فونٹ لوڈ کریں
if let customFont = UIFont(name: "MyCustomFont-Regular", size: 18) {
label.font = customFont
}
اگر فونٹ کا نام غلط بتایا جائے تو UIFont(name:size:) nil لوٹاتا ہے۔ ڈیبگنگ کے دوران UIFont.familyNames اور UIFont.fontNames(forFamilyName:) کے ذریعے تمام دستیاب فونٹ نام پرنٹ کرنے کی سفارش کی جاتی ہے تاکہ یہ یقینی بنایا جا سکے کہ فونٹ correctly رجسٹرڈ ہے۔
حسب ضرورت فونٹس لوڈ کرنا دو طریقوں سے ممکن ہے: Info.plist (UIAppFonts) کے ذریعے جامد رجسٹریشن اور CTFontManagerRegisterGraphicsFont کے ذریعے متحرک رجسٹریشن۔ پہلا طریقہ آسان ہے — فونٹ ایپ لانچ ہونے کے فوراً بعد دستیاب ہوتا ہے۔ دوسرا نیٹ ورک سے ڈاؤن لوڈ کردہ یا آن ڈیمانڈ وسائل کے لیے استعمال ہوتا ہے۔
متحرک رجسٹریشن آن ڈیمانڈ وسائل کے لیے مفید ہے: اگر ایپ میں 20+ فونٹس ہیں، تو سب کو ابتدائی بنڈل سے خارج کیا جا سکتا ہے اور پہلے استعمال پر ڈاؤن لوڈ کیا جا سکتا ہے۔ CTFontManagerRegisterFontsForURLs مخصوص URLs سے فونٹس رجسٹر کرتا ہے۔ رجسٹریشن کے بعد، فونٹ ہمیشہ کی طرح UIFont(name:size:) کے ذریعے دستیاب ہو جاتا ہے۔
Core Text کے ذریعے حسب ضرورت رینڈرنگ کے لیے، فونٹ کے PostScript نام کے ساتھ CTFontCreateWithName استعمال کریں۔ UIFont سے فرق یہ ہے کہ CTFont کو تبدیلی میٹرکس (CTFontCreateWithNameAndOptions) کے ساتھ بنایا جا سکتا ہے — ترچھے فونٹس بنانے کے لیے: جھکاؤ، X-محور اسکیلنگ، گردش۔ یہ affine تبدیلیوں کے استعمال کے بغیر UIFont میں دستیاب نہیں ہے۔
// ترچھی میٹرکس کے ساتھ CTFont بنائیں
var matrix = CGAffineTransform(a: 1, b: 0, c: 0.2, d: 1, tx: 0, ty: 0)
let ctFont = CTFontCreateWithName(
"Helvetica" as CFString,
24, &matrix)
// UIFont کے ساتھ Toll-Free Bridging استعمال کریں
let uiFont = ctFont as UIFont
label.font = uiFont
تبدیلی میٹرکس علیحدہ فونٹ فائل کے بغیر ترچھے variants بنانے کی اجازت دیتا ہے۔ پیرامیٹر c (skew) حروف میں جھکاؤ شامل کرتا ہے۔ میٹرکس فونٹ کو افقی طور پر اسکیل کرنے کی بھی اجازت دیتا ہے — ایک فونٹ کے سنکشی یا توسیع شدہ variants بنانا۔
UIFont اور CTFont کے درمیان بنیادی فرق تجرید کی سطح ہے۔ UIFont عام کاموں کے لیے ایک سادہ API فراہم کرتا ہے: سسٹم فونٹ حاصل کرنا، سائز تبدیل کرنا، UILabel پر لاگو کرنا۔ CTFont فونٹ پر مکمل کنٹرول فراہم کرتا ہے: گلائف، میٹرکس، OpenType جدولوں اور متغیر محوروں تک رسائی۔ انتخاب کا انحصار کام پر ہے۔
| خصوصیت | UIFont | CTFont |
|---|---|---|
| فریم ورک | UIKit | Core Text |
| تخلیق | systemFont / preferredFont / initWithName | CTFontCreateWithName / CTFontCreateWithDescriptor |
| گلائف تک رسائی | نہیں | CTFontGetGlyphsForCharacters |
| OpenType خصوصیات | محدود (UIFontDescriptor) | مکمل رسائی |
| متغیر فونٹس | UIFontDescriptor کے ذریعے | CTFontCopyVariation / CreateCopyWithVariation |
| رینڈرنگ | UI اجزاء میں خودکار | Core Graphics، حسب ضرورت |
95% iOS ڈیولپمنٹ کاموں کے لیے، UIFont کافی ہے۔ Core Text کے ساتھ CTFont ٹیکسٹ ایڈیٹرز، PDF جنریٹرز، ٹائپوگرافک لے آؤٹ والی کتابیں یا نایاب زبانوں کی حسب ضرورت رینڈرنگ والی ایپس بناتے وقت جائز ہے۔
iOS میں فونٹس کے ساتھ کام کرنے کے لیے کارکردگی پر غور کرنا ضروری ہے۔ ہر منفرد فونٹ پہلی رسائی پر میموری میں لوڈ ہوتا ہے اور وسائل استعمال کرتا ہے۔ San Francisco سسٹم فونٹس پہلے سے لوڈ ہوتے ہیں اور کوئی اضافی بوجھ نہیں ڈالتے۔ حسب ضرورت فونٹس فائل سے لوڈ ہوتے ہیں اور پہلے لوڈ کے بعد سسٹم کے ذریعے کیش کیے جاتے ہیں۔
ایک ایپ میں منفرد فونٹس کی تعداد کو 3-5 خاندانوں تک محدود کرنے کی سفارش کی جاتی ہے۔ ہر فونٹ میموری میں 50 KB سے 2 MB تک جگہ لیتا ہے۔ ایک ہی خاندان کے مختلف وزن (regular، bold، medium) استعمال کرنا کئی مختلف خاندانوں کو لوڈ کرنے سے زیادہ موثر ہے۔
سسٹم بنائے گئے UIFont نمونوں کو کیش کرتا ہے، لہٰذا UIFont.systemFont(ofSize: 16, weight: .regular) کی بار بار کالیں نیا آبجیکٹ نہیں بناتیں۔ تاہم، حسب ضرورت فونٹس کے لیے UIFont(name:size:) ہمیشہ کیش نہیں ہوتا — فائل سے دوبارہ لوڈنگ سے بچنے کے لیے بار بار استعمال ہونے والے فونٹس کو جامد خصوصیات یا NSCache میں محفوظ کرنے کی سفارش کی جاتی ہے۔
CTFontManagerRegisterGraphicsFont کے ذریعے متحرک طور پر فونٹس رجسٹر کرتے وقت، اگر فونٹ فائل نیٹ ورک سے ڈاؤن لوڈ ہوتی ہے تو عمل غیر متزامن ہو سکتا ہے۔ اس صورت میں، UILabel یا UITextView کو لوڈنگ مکمل ہونے تک ایک فال بیک سسٹم فونٹ دکھانا چاہیے۔ رجسٹریشن کے بعد، فونٹ دستیاب ہو جاتا ہے اور اسکرین خود بخود متن کی نمائش کو اپ ڈیٹ کرتی ہے۔
اکثر پوچھے گئے سوالات
ہاں، UIFont اور CTFont Toll-Free Bridging کو سپورٹ کرتے ہیں۔ تبدیلی سادہ کاسٹنگ سے کی جاتی ہے: UIFont as CTFont یا CTFont as UIFont۔ کوئی اضافی بوجھ یا ڈیٹا کاپی نہیں ہوتی — دونوں کلاسز میموری میں ایک ہی فونٹ آبجیکٹ کی طرف اشارہ کرتی ہیں۔
تمام UI اجزاء کے لیے، UIFont استعمال کریں۔ یہ UIKit کے لیے بہتر بنایا گیا ہے، Dynamic Type کو سپورٹ کرتا ہے اور سسٹم کی ترتیبات تبدیل ہونے پر صحیح طریقے سے اسکیل ہوتا ہے۔ CTFont صرف Core Graphics کے ذریعے حسب ضرورت رینڈرنگ یا نچلی سطحی فونٹ میٹرکس رسائی کی ضرورت ہونے پر جائز ہے۔
خاندانوں کی فہرست کے لیے UIFont.familyNames اور PostScript ناموں کے لیے UIFont.fontNames(forFamilyName:) استعمال کریں۔ ڈیبگ موڈ میں اس کوڈ کو کال کریں اور مطلوبہ فونٹ تلاش کریں۔ PostScript نام میں عام طور پر خاندان کا نام اور اسٹائل ہوتا ہے: «SFProText-Regular»، «HelveticaNeue-Bold»۔
ہاں، UIFontDescriptor کے ذریعے آپ متغیر محور ترتیب دے سکتے ہیں: weight، width، slant۔ تاہم، متغیر فونٹس کے لیے UIFont API CTFontCopyVariation کے مقابلے میں محدود ہے۔ متغیر محوروں پر مکمل کنٹرول کے لیے، Core Text اور CTFontCreateCopyWithVariation استعمال کریں۔
نام اور سائز کے امتزاج سے کلید کے ساتھ ایک جامد لغت یا NSCache بنائیں۔ سسٹم فونٹس کے لیے، iOS خود بخود نمونوں کو کیش کرتا ہے، لیکن UIFont(name:size:) کے ذریعے بنائے گئے حسب ضرورت فونٹس کے لیے، TTF فائل سے دوبارہ لوڈنگ سے بچنے کے لیے ایپ کیش میں آبجیکٹ محفوظ کرنے کی سفارش کی جاتی ہے۔
خلاصہ
ہم ایک موبائل ایپلیکیشن ٹرنکی تیار کریں گے
IT Sectr 2017 سے اسٹارٹ اپس اور کاروبار کے لیے iOS اور Android ایپلیکیشنز بناتا ہے۔ ہم آپ کو مشورہ دیں گے اور بہترین حل تجویز کریں گے۔
مزید پڑھیں