মূল পয়েন্ট
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 অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।
আরও পড়ুন