Font Descriptor হলো iOS-এ UIFontDescriptor এবং macOS-এ NSFontDescriptor অবজেক্ট যা সমস্ত ফন্ট মেটাডেটা সংযুক্ত করে: পরিবার, টাইপফেস, আকার, অক্ষর ব্যবধান, লাইন ব্যবধান এবং টাইপোগ্রাফিক বৈশিষ্ট্য। সরাসরি UIFont(name:size:) এর মাধ্যমে ফন্ট তৈরি করার পরিবর্তে, ডেভেলপার ডিস্ক্রিপ্টরের মাধ্যমে কাঙ্ক্ষিত বৈশিষ্ট্য বর্ণনা করে এবং সিস্টেম উপলব্ধ ফন্ট থেকে সেরা মিল নির্বাচন করে। Apple ডেভেলপার ডকুমেন্টেশন অনুসারে, UIFontDescriptor ২০টিরও বেশি ফন্ট অ্যাট্রিবিউট সমর্থন করে এবং সমস্ত iOS টাইপোগ্রাফি ফ্রেমওয়ার্ক — UIKit থেকে Core Text এবং SwiftUI পর্যন্ত — তে ব্যবহৃত হয়।
মূল পয়েন্ট
Font Descriptor একটি অবজেক্ট যা একটি নির্দিষ্ট ফন্ট ফাইলের পরিবর্তে কী-মান জোড়ার সেট হিসাবে ফন্ট বৈশিষ্ট্য বর্ণনা করে। নাম দিয়ে ফন্ট তৈরি করার পরিবর্তে, ডেভেলপার পরিবার, টাইপফেস, আকার এবং ঐচ্ছিক বৈশিষ্ট্য উল্লেখ করে এবং সিস্টেম সেরা মিল নির্বাচন করে। এই পদ্ধতিটি অভিযোজিত টাইপোগ্রাফির জন্য গুরুত্বপূর্ণ: একই ডিস্ক্রিপ্টর বিভিন্ন iOS সংস্করণে কাজ করতে পারে যেখানে উপলব্ধ ফন্টের সেট ভিন্ন হয়। iOS হিউম্যান ইন্টারফেস গাইডলাইন অনুসারে, ডিস্ক্রিপ্টরের মাধ্যমে ফন্ট ম্যাচিং ডায়নামিক ফন্টের সাথে কাজ করার প্রস্তাবিত উপায়।
Font Descriptor ছাড়া, ডেভেলপারদের প্রতিটি ফন্টের উপলব্ধতা নাম দিয়ে পরীক্ষা করতে এবং ম্যানুয়ালি ফallback বিকল্প নির্ধারণ করতে হতো। ডিস্ক্রিপ্টর এই প্রক্রিয়াটি স্বয়ংক্রিয় করে: এতে টাইপফেসের সামঞ্জস্য ম্যাট্রিক্স — সাধারণ, বোল্ড, ইটালিক, বোল্ড ইটালিক — থাকে এবং যখন সঠিক মিল পাওয়া যায় না, তখন এটি নিকটতম উপলব্ধ মিল ফিরিয়ে দেয়। সিস্টেম ম্যাচিং Core Text স্তরে কাজ করে এবং ইউনিফাইড NSFontDescriptor API-এর মাধ্যমে iOS এবং macOS উভয়েই উপলব্ধ।
ডিস্ক্রিপ্টর কাস্টম ফন্ট — Info.plist-এর মাধ্যমে লোড করা বা ম্যানুয়ালি যোগ করা — জন্যও ব্যবহৃত হয়। যদি একটি ফন্ট সিস্টেমে নিবন্ধিত হয়, তবে এর ডিস্ক্রিপ্টর সিস্টেম ফন্টের মতোই তৈরি হয়। ক্রস-প্ল্যাটফর্ম নোট: ডিস্ক্রিপ্টরের ধারণা Android-এ Typeface.Builder-এর মাধ্যমেও বিদ্যমান, কিন্তু iOS বাস্তবায়ন UIFontDescriptor-এর মাধ্যমে উল্লেখযোগ্যভাবে বেশি বৈশিষ্ট্য প্রদান করে — Android-এ ৫টির তুলনায় ২০টিরও বেশি।
UIFontDescriptor-এ [UIFontDescriptor.AttributeName: Any] ধরণের fontAttributes অভিধানে গোষ্ঠীভুক্ত বৈশিষ্ট্য থাকে। মূল বৈশিষ্ট্যগুলির মধ্যে ফন্ট পরিবার, নাম, আকার, ট্রেইটস, রূপান্তর ম্যাট্রিক্স, অপটিক্যাল আকার এবং টেক্সট শৈলী অন্তর্ভুক্ত। Apple WWDC 2019 সেশন 227 অনুসারে, টেক্সট শৈলী — Dynamic Type — ব্যবহার করা অ্যাক্সেসিবিলিটি-সামঞ্জস্যপূর্ণ অ্যাপ্লিকেশনের জন্য বাধ্যতামূলক।
traits অ্যাট্রিবিউট একটি অভিধান যা প্রতীকী বৈশিষ্ট্য ধারণ করে: ওজন (UIFontWeightTrait), ঢাল (UIFontSlantTrait), প্রস্থ (UIFontWidthTrait) এবং অন্যান্য। এই মানগুলি ফন্ট ম্যাচার টাইপফেস নির্বাচন করতে ব্যবহার করে। উদাহরণস্বরূপ, UIFontWeightTrait মান 0.0 — সাধারণ টাইপফেস, 0.3 — বোল্ড। সিস্টেম স্বয়ংক্রিয়ভাবে সংখ্যাসূচক মানগুলি উপলব্ধ ফন্ট ভেরিয়েন্টে ম্যাপ করে।
অতিরিক্ত বৈশিষ্ট্যগুলির মধ্যে OpenType বৈশিষ্ট্যগুলির জন্য featureSettings (লিগেচার, কার্নিং, সংখ্যা অনুপাত), ব্যবহারকারীকে প্রদর্শনের জন্য visibleName, ফন্টের অ্যাফিন রূপান্তরের জন্য matrix এবং ক্যাসকেডিং ফallback ফন্ট তালিকার জন্য 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 টেকনিক্যাল Q&A 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-এ ০.৫ থেকে ৫ মিলিসেকেন্ড নেয়। একক অনুসন্ধানের জন্য এটি নগণ্য, কিন্তু ডিস্ক্রিপ্টরের উপর বাল্ক পুনরাবৃত্তির জন্য (উদাহরণস্বরূপ, ৫০+ ফন্ট সহ একটি পিকারে), ফলাফল ক্যাশে করার সুপারিশ করা হয়। Apple স্ক্রিন লোড করার সময় একবার ম্যাচিং সম্পাদন এবং ডিস্ক্রিপ্টরের অ্যারে সংরক্ষণ করার সুপারিশ করে।
Core Text iOS এবং macOS-এ টাইপোগ্রাফির সাথে কাজ করার জন্য একটি নিম্ন-স্তরের C-ভিত্তিক ফ্রেমওয়ার্ক। UIFontDescriptor-এর এর প্রতিরূপ হলো CTFontDescriptor, যা Core Foundation স্তরে একই ক্ষমতা প্রদান করে। CTFontDescriptor Core Text API-তে ফন্ট তৈরি, টেক্সট মাপা এবং জটিল টাইপোগ্রাফি রেন্ডার করতে ব্যবহৃত হয়। UIFontDescriptor মূলত বর্ধিত বৈশিষ্ট্যের সেট সহ CTFontDescriptor-এর চারপাশে একটি Objective-C র্যাপার।
UIFontDescriptor এবং CTFontDescriptor-এর মধ্যে টোল-ফ্রি ব্রিজিং রূপান্তর ছাড়াই UIKit এবং Core Text-এর মধ্যে ডিস্ক্রিপ্টর পাস করার অনুমতি দেয়। এটি সেই অ্যাপ্লিকেশনগুলির জন্য গুরুত্বপূর্ণ যা কাস্টম টেক্সট রেন্ডারিং ব্যবহার করে — উদাহরণস্বরূপ, TextKit-ভিত্তিক টেক্সট এডিটর বা সিনট্যাক্স হাইলাইটিং সহ কোড এডিটর। উদাহরণ: CTFontDescriptorCreateCopyWithAttribute একটি যোগ করা বৈশিষ্ট্য সহ ডিস্ক্রিপ্টরের একটি কপি তৈরি করে — UIFontDescriptor-এর addingAttributes-এর একটি অ্যানালগ।
মূল বৈশিষ্ট্য kCTFontURLAttribute CTFontDescriptor-এ ফন্ট ফাইলের URL ধারণ করে। এটি নির্ধারণ করতে দেয় যে একটি ফন্ট সিস্টেম না কাস্টম। কাস্টম ফন্টের জন্য, URL ফন্ট ফাইল (.ttf বা .otf) নির্দেশ করে; সিস্টেম ফন্টের জন্য — সিস্টেম ফন্ট ডিরেক্টরি নির্দেশ করে। ডিস্ক্রিপ্টরের মাধ্যমে ডেটা শুধুমাত্র পঠনযোগ্য; URL-এর মাধ্যমে ফন্ট ফাইল পরিবর্তন করা সমর্থিত নয়।
উন্নত টাইপোগ্রাফির জন্য — কাস্টম লিগেচার, প্রাসঙ্গিক প্রতিস্থাপন, বিকল্প গ্লিফ — kCTFontFeatureSettingsAttribute কী সহ CTFontDescriptorCopyAttribute ব্যবহার করুন। এই বৈশিষ্ট্যটিতে OpenType বৈশিষ্ট্য অভিধানের একটি অ্যারে থাকে যা ডিস্ক্রিপ্টরের মাধ্যমে যোগ করা যেতে পারে। Apple Core Text প্রোগ্রামিং গাইড অনুসারে, UIFontDescriptor-কে Core Text-এর সাথে একত্রিত করা অ্যাপ্লিকেশন টাইপোগ্রাফির উপর সম্পূর্ণ নিয়ন্ত্রণ দেয়।
প্রায়শই জিজ্ঞাসিত প্রশ্ন
UIFont একটি ব্যবহারের জন্য প্রস্তুত ফন্ট যা টেক্সট রেন্ডার করে। Font Descriptor একটি ফন্ট বর্ণনা — বৈশিষ্ট্যের একটি সেট যা থেকে UIFont তৈরি করা যেতে পারে। একটি ডিস্ক্রিপ্টর বিভিন্ন আকারের একাধিক UIFont তৈরি করতে পারে।
হ্যাঁ। যদি ফন্ট সিস্টেমে নিবন্ধিত হয় (Info.plist বা Core Graphics-এর মাধ্যমে), তবে এর ডিস্ক্রিপ্টর পরিবার বা নাম দ্বারা সিস্টেম ফন্টের মতোই তৈরি হয়। ম্যাচিং যে কোনো নিবন্ধিত ফন্টের জন্য কাজ করে।
প্রদর্শিত নাম পেতে descriptor.object(forKey: .visibleName) বা PostScript নামের জন্য descriptor.postscriptName ব্যবহার করুন। PostScript নাম UIFont(name:size:) এর মাধ্যমে ফন্ট তৈরি করার সময় ব্যবহৃত হয়।
ক্যাসকেড তালিকা নেস্টেড ডিস্ক্রিপ্টরের একটি অ্যারে যা ফallback ফন্ট হিসাবে কাজ করে। যদি প্রাথমিক ফন্টে প্রয়োজনীয় অক্ষর না থাকে, সিস্টেম ক্যাসকেড তালিকা থেকে ক্রমিকভাবে ফন্ট পরীক্ষা করে। এটি ইমোজি এবং CJK অক্ষর সমর্থনের জন্য ব্যবহৃত হয়।
হ্যাঁ। SwiftUI Font(descriptor:size:) এর মাধ্যমে Font Descriptor সমর্থন করে। SwiftUI র্যাপার UIFontDescriptor গ্রহণ করে এবং সমস্ত ডিস্ক্রিপ্টর বৈশিষ্ট্য — কার্নিং, লিগেচার এবং টাইপফেস — সংরক্ষণ করে একটি SwiftUI ফন্ট তৈরি করে।
সারাংশ
আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব
IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।
আরও পড়ুন