Custom Font ایک فونٹ فائل (TTF, OTF, WOFF2) ہے جسے ڈویلپر ڈیفالٹ سسٹم فونٹ کو تبدیل کرنے کے لیے موبائل ایپلیکیشن میں شامل کرتا ہے۔ کسٹم فونٹس کا استعمال منفرد بصری انداز بنانے، برانڈ مستقل مزاجی برقرار رکھنے اور مختلف زبانوں میں پڑھنے کی اہلیت بہتر بنانے کے لیے کیا جاتا ہے۔ Apple Fonts کے مطابق، کسٹم فونٹس تمام Apple پلیٹ فارمز پر سپورٹ کیے جاتے ہیں، اور Android لوڈنگ کو آسان بنانے کے لیے Font Family میکانزم فراہم کرتا ہے۔ مناسب فونٹ انضمام ٹائپوگرافی اور ایپلیکیشن کے مجموعی تاثر کو اہم طور پر متاثر کرتا ہے۔
اہم نکات
Custom Font (کسٹم فونٹ) ایک ٹائپ فیس فائل ہے جو آپریٹنگ سسٹم کے ڈیفالٹ فونٹ سیٹ کا حصہ نہیں ہے۔ ڈویلپر منفرد، برانڈ سے مطابقت رکھنے والی ٹائپوگرافی کے لیے اپنے پروجیکٹس میں اس طرح کے فونٹس شامل کرتے ہیں۔ کسٹم فونٹس ادائیگی والے تجارتی ٹائپ فیسس یا مفت اوپن سورس فونٹس جیسے Inter، Montserrat یا Roboto کے کسٹم ورژن ہو سکتے ہیں۔
کسٹم فونٹس کے عام استعمال کے معاملات میں شامل ہیں: برانڈ ایپ لوگو اور سرخیاں، مخصوص ٹائپوگرافک تقاضوں والی پڑھنے کی ایپس، تھیمیٹک فونٹس والے گیمز اور غیر لاطینی زبانوں کے لیے ایپلیکیشنز جہاں سسٹم فونٹ مطلوبہ گلائف کو سپورٹ نہیں کرتا۔ Google Fonts کے مطابق، ٹاپ 100 ایپس میں سے 60% سے زیادہ بصری تفریق کے لیے اپنے فونٹس کو کسٹمائز کرتی ہیں۔
سسٹم فونٹس (iOS پر San Francisco، Android پر Roboto) انٹرفیس کے لیے بہتر بنائے گئے ہیں لیکن برانڈ ٹائپوگرافی کے لیے موزوں نہیں ہیں۔ ایک کسٹم فونٹ برانڈ پہچان کو مضبوط کرتا ہے، اس میں خاص حروف (آئیکن فونٹس) شامل ہو سکتے ہیں اور مخصوص سامعین کے لیے پڑھنے کی اہلیت بہتر بناتا ہے۔ تاہم، مختلف فونٹس کا زیادہ استعمال UX کو خراب کرتا ہے — فی ایپلیکیشن 2–3 سے زیادہ فیملیز نہ استعمال کرنے کی سفارش کی جاتی ہے۔
موبائل پلیٹ فارم کئی فونٹ فارمیٹس کو سپورٹ کرتے ہیں۔ TrueType (TTF) سب سے عام فارمیٹ ہے، جو iOS اور Android کے تمام ورژنز کے ساتھ مطابقت رکھتا ہے۔ OpenType (OTF) TTF کی ایک توسیع ہے جو لیگیچرز، متبادل گلائف اور OpenType فیچرز کی سپورٹ کے ساتھ ہے۔ دونوں فارمیٹس کی ایکسٹینشن .ttf اور .otf ہے اور موبائل پلیٹ فارمز پر ایک جیسے کام کرتے ہیں۔
WOFF2 (Web Open Font Format 2) ویب کے لیے ایک کمپریسڈ فارمیٹ ہے، جو Android ورژن 10 سے سپورٹ کیا جاتا ہے۔ WOFF2 TTF کے مقابلے میں 30–50% کمپریشن فراہم کرتا ہے۔ iOS کے لیے، WOFF2 Safari کے ذریعے سپورٹ کیا جاتا ہے، لیکن نیٹیو ایپلیکیشنز کو TTF/OTF میں تبدیلی کی ضرورت ہوتی ہے۔ متغیر فونٹس (Variable Fonts) ایک جدید فارمیٹ ہیں جو تمام وزن کو ایک فائل میں ذخیرہ کرتے ہیں۔
| فارمیٹ | iOS | Android | کمپریشن | خصوصیات |
|---|---|---|---|---|
| TTF | ہاں | ہاں | نہیں | معیاری فارمیٹ، وسیع مطابقت |
| OTF | ہاں | ہاں | نہیں | OpenType فیچرز، لیگیچرز، متبادل گلائف |
| WOFF2 | Safari کے ذریعے | API 29+ | 30–50% | کمپریسڈ، APK سائز بچاتا ہے |
| Variable | iOS 11+ | API 29+ | اعلی | تمام وزن کے لیے ایک فائل |
موبائل ڈویلپمنٹ کے لیے، بنیادی فارمیٹ کے طور پر OTF استعمال کرنے کی سفارش کی جاتی ہے — یہ TTF کے برابر سائز پر OpenType فیچرز کو سپورٹ کرتا ہے۔ APK جگہ بچانے کے لیے، woff2 کے ذریعے کمپریشن یا آن ڈیمانڈ فونٹ لوڈنگ استعمال کریں۔
iOS میں کسٹم فونٹ ضم کرنے کا عمل دو مراحل پر مشتمل ہے: فائل کو پروجیکٹ بنڈل میں شامل کرنا اور Info.plist میں رجسٹر کرنا۔ فونٹ فائل کو پروجیکٹ ڈائریکٹری (عام طور پر Resources/Fonts) میں رکھا جاتا ہے اور ٹارگٹ میں شامل کیا جاتا ہے۔ Info.plist میں، ایکسٹینشن سمیت فونٹ فائل ناموں کے ساتھ UIAppFonts اری (Fonts provided by application) شامل کی جاتی ہے۔
رجسٹریشن کے بعد، فونٹ اپنے PostScript نام کا استعمال کرتے ہوئے UIFont(name:size:) کے ذریعے قابل رسائی ہوتا ہے۔ PostScript نام UIFont.familyNames اور UIFont.fontNames(forFamilyName:) کے ذریعے تلاش کیا جا سکتا ہے۔ اگر نام غلط ہے، تو UIFont(name:size:) nil لوٹاتا ہے۔ ڈیبگنگ کے لیے، پہلے لانچ پر تمام رجسٹرڈ فونٹس کو اسکرین پر ڈسپلے کرنے کی سفارش کی جاتی ہے۔
آئیے Swift میں iOS پروجیکٹ میں Montserrat فونٹ ضم کرنے کا مکمل چکر دیکھتے ہیں۔ Montserrat-Regular.ttf فائل پروجیکٹ میں شامل کی جاتی ہے، Info.plist میں اعلان کیا جاتا ہے، پھر UIFont کے ذریعے لوڈ کیا جاتا ہے اور UILabel پر لاگو کیا جاتا ہے۔ ہر وزن (regular, bold, italic) کے لیے علیحدہ فائل اور Info.plist میں علیحدہ اندراج کی ضرورت ہوتی ہے۔
// 1. Info.plist میں: UIAppFonts → "Montserrat-Regular.ttf"
// 2. کوڈ میں فونٹ لوڈ کریں
guard let customFont = UIFont(name: "Montserrat-Regular", size: 16) else {
// سسٹم فونٹ پر فال بیک
label.font = UIFont.systemFont(ofSize: 16)
return
}
label.font = customFont
// 3. NSAttributedString میں استعمال کریں
let attributes = [NSAttributedString.Key.font: customFont]
let attributed = NSAttributedString(string: "Text", attributes: attributes)
فونٹ لوڈ نہ ہونے کی صورت (UIFont nil لوٹاتا ہے) کو سنبھالنا لازمی ہے۔ ایپلیکیشن کریش کرنے کے بجائے، سسٹم فونٹ کو فال بیک کے طور پر استعمال کریں۔ یہ نیٹ ورک سے لوڈ کردہ یا اختیاری ماڈیولز میں شامل کردہ فونٹس کے لیے خاص طور پر اہم ہے۔
آن ڈیمانڈ ڈاؤن لوڈ کردہ فونٹس کے لیے، CTFontManagerRegisterGraphicsFont استعمال کیا جاتا ہے۔ یہ طریقہ میموری میں ڈیٹا (Data) سے فونٹ رجسٹر کرتا ہے اور اسے UIFont کے لیے دستیاب بناتا ہے۔ استعمال کے بعد، CTFontManagerUnregisterGraphicsFont کے ذریعے فونٹ کو غیر رجسٹر کیا جا سکتا ہے۔ ڈائنامک لوڈنگ بڑے فونٹ سیٹ والی ایپلیکیشنز کے لیے مفید ہے جہاں سب کی فوری ضرورت نہیں ہوتی۔
Android پر، کسٹم فونٹس res/font ریسورس سسٹم کے ذریعے شامل کیے جاتے ہیں۔ TTF یا OTF فائلیں res/font/ میں رکھی جاتی ہیں، اس کے بعد وزن کو گروپ کرنے کے لیے XML Font Family ریسورسز بنائے جاتے ہیں۔ Android 8.0 (API 26) سے شروع کرتے ہوئے، یہ واحد تجویز کردہ طریقہ ہے۔ پرانے ورژنز کے لیے، assets اور Typeface.createFromAsset استعمال کیا جاتا ہے۔
XML Font Family ایک وزن (regular, bold, italic) اور فونٹ فائل کے درمیان میپنگ کو بیان کرتی ہے۔ XML لے آؤٹ میں، خصوصیت android:fontFamily="@font/my_font" متعلقہ اسٹائل کے ساتھ setTypeface کال کرنے پر خود بخود صحیح فائل منتخب کرتی ہے۔ یہ ٹائپوگرافی کو آسان بناتا ہے — تھیم میں فیملی کی وضاحت کریں، اور setTypeface(textView, Typeface.BOLD) کال کرنے پر Android خود بخود بولڈ ورژن منتخب کرے گا۔
res/font/my_font.xml پر ایک XML فائل بنائیں جو مختلف وزنوں کے لیے تمام فونٹ فائلوں کی فہرست دیتی ہے۔ ہر عنصر میں fontStyle (normal/italic) اور fontWeight (100–900) خصوصیات ہیں۔ پھر لے آؤٹ میں android:fontFamily="@font/my_font" بتائیں۔ جب textStyle="bold" استعمال کیا جاتا ہے، Android خود بخود fontWeight 700 والی فائل منتخب کرتا ہے۔
<!-- res/font/my_font.xml -->
<?xml version="1.0" encoding="utf-8"?>
<font-family xmlns:app="http://schemas.android.com/apk/res-auto">
<font
android:fontStyle="normal"
android:fontWeight="400"
app:font="@font/my_font_regular" />
<font
android:fontStyle="normal"
android:fontWeight="700"
app:font="@font/my_font_bold" />
</font-family>
Font Family استعمال کرتے وقت، ریسورس اپروچ خود بخود فونٹس کو کیش کرتا ہے اور صحیح وزن منتخب کرتا ہے۔ اگر مطلوبہ وزن فیملی میں دستیاب نہیں ہے، تو Android اسے قریب ترین دستیاب وزن سے ترکیب کرتا ہے۔ فونٹ پر درست کنٹرول کے لیے، واضح فائل ریفرنس کے ساتھ Typeface.create() استعمال کریں۔
کراس پلیٹ فارم فریم ورکس میں، فونٹ انضمام یکساں ہے۔ Flutter فونٹس کا اعلان کرنے کے لیے pubspec.yaml استعمال کرتا ہے: فائلیں پروجیکٹ کے fonts/ فولڈر میں رکھی جاتی ہیں اور پھر فیملی اور وزن کے ساتھ fonts سیکشن میں درج کی جاتی ہیں۔ فونٹ پھر TextStyle(fontFamily: 'Montserrat') یا ایپ تھیم کے ذریعے لاگو کیا جاتا ہے۔ Flutter TTF اور OTF کو سپورٹ کرتا ہے۔
React Native دو طریقے استعمال کرتا ہے: نیٹیو (Info.plist اور res/font کے ذریعے) یا react-native-vector-icons اور @expo-google-fonts جیسی لائبریریوں کے ذریعے۔ Expo عمل کو آسان بناتا ہے — فونٹس expo-font کے ذریعے لوڈ کیے جاتے ہیں: Font.loadAsync({ 'Montserrat': require('./assets/fonts/Montserrat.ttf') })۔ React Navigation اور تھیمز فونٹ کو عالمی طور پر سیٹ کرنے کی اجازت دیتے ہیں۔
pubspec.yaml میں فونٹس کا اعلان اور MaterialApp تھیم میں اطلاق۔ Montserrat-Regular.ttf اور Montserrat-Bold.ttf فائلیں fonts/ میں رکھی جاتی ہیں۔ اعلان کے بعد، فونٹ پوری ایپلیکیشن میں TextStyle کے ذریعے قابل رسائی ہوتا ہے۔ جب fontWeight: FontWeight.bold بتایا جاتا ہے، Flutter خود بخود بولڈ فائل استعمال کرتا ہے۔
// pubspec.yaml
flutter:
fonts:
- family: Montserrat
fonts:
- asset: fonts/Montserrat-Regular.ttf
- asset: fonts/Montserrat-Bold.ttf
weight: 700
// تھیم میں استعمال
MaterialApp(
theme: ThemeData(
textTheme: TextTheme(
headlineLarge: TextStyle(
fontFamily: 'Montserrat',
fontWeight: FontWeight.bold,
fontSize: 28
)
)
)
)
اگر Flutter کو بتائے گئے راستے پر فونٹ نہیں ملتا، تو ایپلیکیشن غلطیوں کے بغیر سسٹم فال بیک فونٹ استعمال کرتی ہے۔ ڈیبگنگ کے لیے، MaterialApp میں checkConsistency کو فعال کریں — یہ فونٹ کی دستیابی کو چیک کرتا ہے اور فونٹس غائب ہونے پر کنسول میں انتباہ پرنٹ کرتا ہے۔
APK اور IPA کا سائز براہ راست شامل فونٹس کی تعداد پر منحصر ہے۔ ایک TTF فائل لاطینی حروف کے سیٹ کے لیے 50–500 KB اور سیریلک، CJK حروف یا دیگر توسیعی سیٹوں کو سپورٹ کرنے والے فونٹس کے لیے 2–5 MB تک ہوتی ہے۔ دس فونٹس ایپلیکیشن کے سائز میں 10–20 MB کا اضافہ کر سکتے ہیں، جو موبائل ڈاؤن لوڈز کے لیے اہم ہے۔
اصلاح کے لیے، سب سیٹنگ استعمال کریں — فونٹ فائل سے غیر استعمال شدہ حروف کو ہٹانا۔ glyphhanger، fonttools (pyftsubset) اور Google Webfont Optimizer جیسے ٹولز صرف ضروری گلائف (لاطینی + سیریلک + ہندسے + اوقاف) کے ساتھ فونٹ ورژن بناتے ہیں۔ یہ سائز 50–80% کم کرتا ہے۔ iOS پر، آن ڈیمانڈ ریسورسز ان فونٹس کے لیے استعمال کیے جا سکتے ہیں جن کی پہلے لانچ پر ضرورت نہیں ہوتی۔
متغیر فونٹ (Variable Font) ایک فائل ہے جو Thin سے Black اور Condensed سے Expanded تک تمام وزن پر مشتمل ہوتی ہے۔ ایک متغیر فونٹ مختلف وزنوں والی 10–20 علیحدہ فائلوں کو تبدیل کر سکتا ہے۔ اس طرح کی فائل کا سائز تقریباً 1–2 اسٹیٹک فائلوں کے برابر ہوتا ہے۔ سپورٹ: iOS 11+، Android 10+، Flutter (FontVariation کے ذریعے)، React Native (کسٹم لائبریریوں کے ذریعے)۔
فونٹ سائز 30–50% کم کرنے کے لیے WOFF2 استعمال کریں۔ API 29 والے Android پر، WOFF2 براہ راست استعمال کیا جا سکتا ہے۔ iOS کے لیے، رجسٹریشن سے پہلے WOFF2 کو TTF میں تبدیل کرنا ضروری ہے۔ صرف آن بورڈنگ کے دوران یا مخصوص اسکرینوں پر استعمال ہونے والے فونٹس کو آن ڈیمانڈ ریسورسز (iOS) یا Dynamic Feature (Android) کے ذریعے لوڈ کیا جانا چاہیے — وہ بیس APK میں شامل نہیں ہوں گے۔
کسٹم فونٹس کارکردگی کو دو طریقوں سے متاثر کرتے ہیں: لوڈنگ کا وقت اور میموری۔ پہلی رسائی پر، سسٹم ڈسک سے فائل پڑھتا ہے، فونٹ ٹیبلز کو پارس کرتا ہے اور رینڈرنگ کے لیے اندرونی ڈھانچے بناتا ہے۔ 1 MB فونٹ کے لیے، اس میں 20–50 ms لگتے ہیں۔ پہلی لوڈ کے بعد کیشنگ بعد کی رسائیوں میں تاخیر کو ختم کرتی ہے۔
میموری: لوڈ کردہ ہر فونٹ پروسیس کیش میں محفوظ ہوتا ہے۔ سسٹم فونٹس پری لوڈ ہوتے ہیں؛ کسٹم فونٹس پہلے استعمال پر لوڈ ہوتے ہیں۔ میموری میں، ایک فونٹ پارس شدہ ڈھانچوں کی وجہ سے ڈسک کے مقابلے میں تقریباً 2–3 گنا زیادہ جگہ لیتا ہے: cmap, glyf, head, hmtx ٹیبلز۔ اوسط سائز کے 5 کسٹم فونٹس (کل 3 MB) کے لیے، تقریباً 6–9 MB RAM درکار ہوتی ہے۔
کسٹم فونٹس کو فی ایپلیکیشن 2–3 فیملیز تک محدود کریں۔ متعدد وزن تبدیل کرنے کے لیے متغیر فونٹس استعمال کریں۔ UI عناصر (بٹن، لیبل، فہرستیں) کے لیے سسٹم فونٹس لگائیں اور صرف زور دار ٹائپوگرافی (سرخیاں، بینرز) کے لیے کسٹم فونٹس استعمال کریں۔ Android پر Map کے ذریعے Typeface کیش کریں اور iOS پر اسٹیٹک ویری ایبلز کے ذریعے UIFont کیش کریں۔
object FontCache {
private val cache = mutableMapOf<String, Typeface>()
fun get(context: Context, fontId: Int): Typeface {
return cache.getOrPut(fontId.toString()) {
ResourcesCompat.getFont(context, fontId)
}
}
}
// RecyclerView میں استعمال
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
holder.textView.typeface = FontCache.get(context, R.font.montserrat_regular)
}
onBindViewHolder میں Typeface لوڈ کرنا صرف کیشنگ کے ساتھ قابل قبول ہے۔ کیش کے بغیر، ہر createFromAsset کال ایک نیا آبجیکٹ بناتی ہے اور ڈسک سے فائل پڑھتی ہے۔ RecyclerView اسکرولنگ کے دوران، یہ نمایاں تاخیر کا سبب بنتا ہے۔ کیش مسئلہ حل کرتا ہے کیونکہ فونٹ ایک بار لوڈ ہوتا ہے اور دوبارہ استعمال ہوتا ہے۔
اکثر پوچھے گئے سوالات
OTF موبائل ایپلیکیشنز کے لیے بہترین انتخاب ہے۔ یہ TTF کے برابر سائز پر OpenType فیچرز (لیگیچرز، متبادل گلائف) کو سپورٹ کرتا ہے۔ جگہ بچانے کے لیے، سب سیٹنگ کے ساتھ متغیر فونٹس (TTX یا OTF) استعمال کریں۔ WOFF2 صرف Android 10+ کے لیے موزوں ہے اور نیٹیو ایپلیکیشنز میں iOS پر سپورٹ نہیں کیا جاتا۔
ہاں۔ Google Fonts تجارتی استعمال کے لیے OFL (Open Font License) لائسنس کے تحت فونٹس فراہم کرتا ہے۔ فونٹس fonts.google.com سے ڈاؤن لوڈ کیے جا سکتے ہیں اور پروجیکٹ میں شامل کیے جا سکتے ہیں۔ Android Google Play Services کے ذریعے ڈاؤن لوڈ قابل فونٹس کو سپورٹ کرتا ہے، جو فونٹ فائلوں کو APK سے خارج رکھنے اور پہلے استعمال پر لوڈ کرنے کی اجازت دیتا ہے۔
سب سے عام وجوہات: فائل ٹارگٹ میں شامل نہیں کی گئی (iOS)، Info.plist میں اعلان نہیں کیا گیا (iOS)، فائل res/font میں نہیں ہے (Android)، PostScript نام غلط ہے، یا فائل خراب ہے۔ iOS پر تشخیص کے لیے، کنسول میں UIFont.familyNames پرنٹ کریں۔ Android پر، assets سے فونٹ لوڈنگ کو ڈیبگ کرنے کے لیے FontLoader استعمال کریں۔
غیر استعمال شدہ حروف کو ہٹانے کے لیے سب سیٹنگ (pyftsubset) استعمال کریں — سائز 50–80% کم کرتا ہے۔ 10 علیحدہ فائلوں کے بجائے متغیر فونٹس استعمال کریں۔ Android 10+ کے لیے WOFF2 کمپریشن استعمال کریں۔ فونٹ پاتھ کو مبہم کرنے کے لیے ProGuard کنفیگر کریں۔ iOS کے لیے، آن ڈیمانڈ ریسورسز استعمال کریں۔
2–3 فیملیز (مختلف وزن سمیت) تک محدود رہنے کی سفارش کی جاتی ہے۔ ہر فیملی ایپلیکیشن کے سائز میں 200 KB سے 3 MB کا اضافہ کرتی ہے۔ سسٹم فونٹس ایپ کو بوجھل نہیں کرتے، لہذا UI عناصر کے لیے سسٹم فونٹس استعمال کریں اور کسٹم فونٹس کو سرخیوں اور زور دار بلاکس کے لیے محفوظ رکھیں۔
خلاصہ
ہم ایک موبائل ایپلیکیشن ٹرنکی تیار کریں گے
IT Sectr 2017 سے اسٹارٹ اپس اور کاروبار کے لیے iOS اور Android ایپلیکیشنز بناتا ہے۔ ہم آپ کو مشورہ دیں گے اور بہترین حل تجویز کریں گے۔
مزید پڑھیں