Dynamic Type একটি অন্তর্নির্মিত iOS বৈশিষ্ট্য যা ব্যবহারকারীর সিস্টেম সেটিংস অনুযায়ী অ্যাপে ফন্টের আকার স্বয়ংক্রিয়ভাবে পরিবর্তন করে। ব্যবহারকারী সেটিংস → ডিসপ্লে ও ব্রাইটনেস → টেক্সট সাইজে তাদের পছন্দের টেক্সট আকার সেট করে এবং Dynamic Type সমর্থনকারী সব অ্যাপ অতিরিক্ত কোনো পদক্ষেপ ছাড়াই মানিয়ে নেয়। Apple Human Interface Guidelines, 2024 অনুযায়ী, Dynamic Type সমর্থন App Store-এ প্রকাশের জন্য বাধ্যতামূলক, কারণ এটি iOS প্ল্যাটফর্মে অ্যাক্সেসিবিলিটির মৌলিক উপাদান।
মূল বিষয়
Dynamic Type একটি iOS প্রযুক্তি যা iOS 7-এ চালু হয় এবং অ্যাপের টেক্সটকে সিস্টেম ফন্ট সাইজ সেটিংসের সাথে স্বয়ংক্রিয়ভাবে মানিয়ে নিতে দেয়। ব্যবহারকারী একসঙ্গে সব অ্যাপে ফন্ট বাড়াতে বা কমাতে পারেন — প্রতিটি অ্যাপের ভিতরে আলাদাভাবে সেটিংস পরিবর্তন করার প্রয়োজন নেই।
Apple WWDC 2023, “Make Your App Visually Accessible” অনুযায়ী, 40% এর বেশি iOS ব্যবহারকারী ডিফল্ট থেকে ফন্টের আকার পরিবর্তন করেন। 65+ বয়সী গোষ্ঠীর জন্য এই সংখ্যা 70% এ পৌঁছায়। Dynamic Type App Store অ্যাক্সেসিবিলিটি সার্টিফিকেশনের জন্য একটি বাধ্যতামূলক প্রয়োজন। সমর্থনের অভাব রিভিউ চলাকালীন অ্যাপ প্রত্যাখ্যানের কারণ।
এটি যেভাবে কাজ করে: অ্যাপ UIFont(name:size:) এর পরিবর্তে UIFont.preferredFont(forTextStyle:) ব্যবহার করে। iOS স্বয়ংক্রিয়ভাবে বর্তমান সিস্টেম সেটিং অনুযায়ী স্কেল করা ফন্ট রিটার্ন করে। যখন সেটিংসে আকার পরিবর্তন হয়, iOS UIContentSizeCategory.didChangeNotification তৈরি করে — অ্যাপকে লেআউট পুনঃগণনা করতে হবে।
Dynamic Type iOS 7-এ ফ্ল্যাট ডিজাইনের সাথে এসেছিল। iOS 10 UIFontMetrics-এর মাধ্যমে কাস্টম ফন্টের জন্য সমর্থন যোগ করে। iOS 11 অ্যাক্সেসিবিলিটি স্তর (AccessibilityXXXL পর্যন্ত) চালু করে। iOS 15 স্বয়ংক্রিয় সমর্থনসহ SwiftUI-তে Dynamic Type যোগ করে। প্রতিটি রিলিজের সাথে Apple প্রয়োজনীয়তা কঠোর করে: iOS 17 থেকে শুরু করে, Dynamic Type সমর্থন ছাড়া অ্যাপ App Store Connect-এ আপলোড করার সময় সতর্কতা পায়।
iOS ডিফল্ট সেটিংয়ের জন্য 8টি টেক্সট স্টাইল প্রদান করে, প্রতিটির পূর্বনির্ধারিত আকার এবং ওজন রয়েছে:
| স্টাইল | ধ্রুবক | আকার (L) | উদ্দেশ্য |
|---|---|---|---|
| Large Title | .largeTitle | 34px | স্ক্রিনের প্রধান শিরোনাম |
| Title 1 | .title1 | 28px | সেকশনের শিরোনাম |
| Title 2 | .title2 | 22px | উপশিরোনাম |
| Title 3 | .title3 | 20px | কার্ডের শিরোনাম |
| Headline | .headline | 17px (বোল্ড) | জোর দেওয়ার জন্য বোল্ড |
| Body | .body | 17px | প্রধান টেক্সট |
| Callout | .callout | 16px | সহায়ক টেক্সট |
| Caption 1 | .caption1 | 12px | ছবির নিচে ক্যাপশন |
| Caption 2 | .caption2 | 11px | ছোট ক্যাপশন |
| Footnote | .footnote | 13px | পাদটীকা, টীকা |
সঠিক স্টাইল ব্যবহার করা শুধু “চেহারা” সম্পর্কে নয়। UIFont.TextStyle.body AccessibilityXXXL মোডে 53px পর্যন্ত পৌঁছাতে পারে। যদি অ্যাপ body-র জন্য 17px-এর ফিক্সড ফন্ট ব্যবহার করে, তবে টেক্সট সেই ব্যবহারকারীদের জন্য অপঠনযোগ্য হয়ে যায় যারা ফন্টের আকার বাড়িয়েছেন।
Dynamic Type শুধু স্কেল করে না — এটি ভিজ্যুয়াল শ্রেণিবিন্যাস সংরক্ষণ করে। Large Title সবসময় Title 1 থেকে বড়, যা Body থেকে বড়, স্কেলিং স্তর যাই হোক না কেন। স্কেলিং সহগ ভিন্ন: শিরোনামগুলি প্রধান টেক্সটের তুলনায় বেশি আক্রমণাত্মকভাবে স্কেল করে, যাতে অ্যাক্সেসিবিলিটি স্তরেও শ্রেণিবিন্যাস বজায় থাকে।
iOS টেক্সট স্কেলিংয়ের 11টি স্তর সমর্থন করে, দুটি বিভাগে বিভক্ত:
body স্টাইলের জন্য XS এবং AccessibilityXXXL-এর মধ্যে পার্থক্য 14px থেকে 53px পর্যন্ত — প্রায় 4×। 17px-এর জন্য ডিজাইন করা লেআউট 53px-এ পুরোপুরি ভেঙে যায়: টেক্সট উপচে পড়ে, বাটন ওভারল্যাপ করে, সেল সংঘর্ষ করে।
কোডে বর্তমান বিভাগ পরীক্ষা করুন:
let category = UIApplication.shared.preferredContentSizeCategory
// .extraSmall, .small, .medium, .large, .extraLarge ...
if category.isAccessibilityCategory {
// বিকল্প লেআউট সক্ষম করুন
}
টেক্সট আকার বিভাগ traitCollection.uiContentSizeCategory-এর মাধ্যমে উপলব্ধ। যখন সিস্টেম সেটিং পরিবর্তন হয়, iOS সব UIView-এ traitCollectionDidChange কল করে। এই পদ্ধতিতে, আপনাকে ফন্ট আপডেট করতে এবং লেআউট পুনঃগণনা করতে হবে। SwiftUI এটি স্বয়ংক্রিয়ভাবে করে — UIKit-এ ম্যানুয়াল সাবস্ক্রিপশন প্রয়োজন।
UICollectionView-এর জন্য, UICollectionViewCompositionalLayout ব্যবহার করুন — এটি স্বয়ংক্রিয়ভাবে স্ক্রিনের প্রস্থ এবং টেক্সট আকার অনুযায়ী কলামের সংখ্যা সমন্বয় করে। অ্যাক্সেসিবিলিটি স্তরে, দুই-কলাম থেকে এক-কলাম লেআউটে স্যুইচ করুন যাতে টেক্সট কাটা না যায় এবং উপাদান ওভারল্যাপ না হয়। শর্তসাপেক্ষ লেআউট ব্যবহার করুন: রেগুলার প্রস্থের জন্য — দুই কলাম, কমপ্যাক্ট বা অ্যাক্সেসিবিলিটির জন্য — এক কলাম।
UIKit-এ মৌলিক বাস্তবায়ন — UIFont.preferredFont(forTextStyle:)। এই পদ্ধতি বর্তমান সিস্টেম সেটিং অনুযায়ী স্কেল করা ফন্ট রিটার্ন করে:
titleLabel.font = UIFont.preferredFont(forTextStyle: .headline)
bodyLabel.font = UIFont.preferredFont(forTextStyle: .body)
কাস্টম ফন্ট-এর জন্য, UIFontMetrics ব্যবহার করুন:
let customFont = UIFont(name: "Montserrat-Regular", size: 16)!
titleLabel.font = UIFontMetrics(forTextStyle: .body)
.scaledFont(for: customFont)
// আকার পরিবর্তন ট্র্যাকিং
NotificationCenter.default.addObserver(
self,
selector: #selector(preferredContentSizeChanged),
name: UIContentSizeCategory.didChangeNotification,
object: nil
)
Interface Builder-এ UILabel-এর জন্য, সহজভাবে ফন্টকে টেক্সট স্টাইল হিসেবে সেট করুন এবং “Automatically Adjusts Font” চালু করুন। কাস্টম ফন্টের জন্য, Interface Builder UIFontMetrics সমর্থন করে না — শুধুমাত্র কোডের মাধ্যমে।
UIFontMetrics একই স্কেলিং বক্ররেখা ব্যবহার করে যা preferredFont ব্যবহার করে। আপনি fromTextStyle: .body, .headline ইত্যাদি নির্দিষ্ট করতে পারেন। প্রতিটি স্টাইলের নিজস্ব স্কেলিং সহগ রয়েছে। Body মধ্যমভাবে স্কেল করে, Large Title আক্রমণাত্মকভাবে স্কেল করে। যদি আপনার কাস্টম ফন্ট প্রধান টেক্সটের জন্য ব্যবহৃত হয়, .body ব্যবহার করুন।
SwiftUI-তে, Dynamic Type সমর্থন ডিফল্টরূপে অন্তর্নির্মিত। সব সিস্টেম মডিফায়ার (.font(.body), .font(.title)) স্বয়ংক্রিয়ভাবে স্কেল করে। ডেভেলপারকে UIFont.preferredFont কল করার প্রয়োজন নেই।
উদাহরণ:
Text("প্রধান টেক্সট")
.font(.body)
.lineLimit(nil)
.minimumScaleFactor(0.5)
কাস্টম স্কেল-এর জন্য, DynamicTypeSize ব্যবহার করুন:
@Environment(\.dynamicTypeSize) var dynamicTypeSize
var body: some View {
Text("অভিযোজিত টেক্সট")
.font(.body)
.padding(dynamicTypeSize <= .large ? 8 : 16)
}
SwiftUI সিস্টেম টেক্সট আকার পরিবর্তন হলে স্বয়ংক্রিয়ভাবে ভিউ আপডেট করে — কোনো অতিরিক্ত নোটিফিকেশন সাবস্ক্রিপশনের প্রয়োজন নেই।
.font(.body) মডিফায়ার শুধুমাত্র সিস্টেম ফন্টের জন্য কাজ করে। SwiftUI-তে কাস্টম ফন্টের জন্য, UIFontMetrics-এর সাথে Font.custom ব্যবহার করুন। iOS 16 থেকে শুরু করে, SwiftUI @Environment-এ DynamicTypeSize সমর্থন করে, যা প্যাডিং এবং লেআউট অভিযোজনের অনুমতি দেয়।
Auto Layout Dynamic Type সমর্থনের জন্য একটি পূর্বশর্ত। ফিক্সড প্রস্থ এবং উচ্চতা (>=, <=) অ্যাক্সেসিবিলিটি আকারে ভেঙে যায়। UILabel-এর জন্য intrinsicContentSize ব্যবহার করুন — এটি বর্তমান ফন্ট আকারের জন্য স্বয়ংক্রিয়ভাবে উচ্চতা গণনা করে।
অভিযোজিত লেআউটের নিয়ম:
লম্বা টেক্সটের জন্য (যেমন নিবন্ধ, ব্যবহারের শর্তাবলী), UILabel-এ minimumScaleFactor সেট করুন — এটি শেষ উপায় হিসেবে টেক্সট ছোট করে যখন Auto Layout কন্টেন্ট ধারণ করতে পারে না। মান 0.5 মানে ফন্ট পছন্দের আকারের 50% পর্যন্ত সঙ্কুচিত হতে পারে।
আকার বিভাগ অনুযায়ী প্যাডিং সমন্বয়ের উদাহরণ:
let isAccessibility = traitCollection
.preferredContentSizeCategory.isAccessibilityCategory
stackView.spacing = isAccessibility ? 16 : 8
button.contentEdgeInsets = isAccessibility
? UIEdgeInsets(top: 16, left: 24, bottom: 16, right: 24)
: UIEdgeInsets(top: 8, left: 16, bottom: 8, right: 16)
টেক্সট কাটা — numberOfLines = 1 এবং ফিক্সড প্রস্থযুক্ত UILabel AccessibilityXL-এ টেক্সট কাটে। সমাধান: numberOfLines = 0 এবং trailing constraint। উপাদানের ওভারল্যাপ — ফিক্সড উচ্চতার বাটন একে অপরের উপর পড়ে। সমাধান: স্বয়ংক্রিয় স্পেসিং সহ UIStackView। স্ক্রিনের বাইরে কন্টেন্ট — অ্যাক্সেসিবিলিটি স্তরের জন্য ScrollView বাধ্যতামূলক।
Xcode সিমুলেটর টেক্সট আকার পরিবর্তনের অনুমতি দেয়: সিমুলেটর মেনুতে Settings → Accessibility → Display & Text Size → Larger Text-এ যান। সব 11টি স্তরের মধ্যে স্যুইচ করুন এবং যাচাই করুন টেক্সট কাটছে না, বাটন অ্যাক্সেসযোগ্য, এবং লেআউট ভাঙছে না।
স্বয়ংক্রিয় পরীক্ষা-র জন্য, XCUIApplication-এ contentSizeCategory সেটিং ব্যবহার করুন:
func testAccessibilitySizes() {
let app = XCUIApplication()
app.launchArguments += [
"-UIPreferredContentSizeCategoryName",
"UICTContentSizeCategoryAccessibilityXXXL"
]
app.launch()
app.scrollViews.buttons["জমা দিন"].tap()
XCTAssertTrue(app.staticTexts["ফর্ম জমা দেওয়া হয়েছে"]
.waitForExistence(timeout: 5))
}
বিভিন্ন launchArguments সহ XCUITest আপনাকে CI-তে সব স্কেলিং স্তর পরীক্ষা করার অনুমতি দেয়। অ্যাক্সেসিবিলিটি বিভাগগুলি আলাদাভাবে পরীক্ষা করতে ভুলবেন না — এগুলি সবচেয়ে বেশি লেআউট ভাঙে। Apple-এর মতে, 70% Dynamic Type বাগ বিশেষভাবে অ্যাক্সেসিবিলিটি স্তরে পাওয়া যায়, কারণ ডেভেলপাররা শুধুমাত্র স্ট্যান্ডার্ড আকার পরীক্ষা করে।
Xcode Accessibility Inspector দেখায় নির্বাচিত উপাদান কোন ফন্ট ব্যবহার করে — ফিক্সড বা স্কেলযোগ্য। যদি উপাদান সিমুলেটরে টেক্সট আকার পরিবর্তনে সাড়া না দেয়, তাহলে ফিক্সড ফন্ট ব্যবহার হচ্ছে। এটি UIFont.preferredFont বা UIFontMetrics দিয়ে প্রতিস্থাপন করুন।
সচরাচর জিজ্ঞাসিত প্রশ্ন
এটি সিস্টেম সাইজ সেটিংস অনুযায়ী অ্যাপে স্বয়ংক্রিয় টেক্সট স্কেলিং। ব্যবহারকারী সেটিংসে আকার পরিবর্তন করে — সব সমর্থিত অ্যাপ ডেভেলপারের অংশগ্রহণ ছাড়াই মানিয়ে নেয়।
না। কাস্টম ফন্ট-এর জন্য, UIFontMetrics(scaledFont:) ব্যবহার করুন। এই পদ্ধতি যেকোনো ফন্টকে নির্দিষ্ট টেক্সট স্টাইলের সাপেক্ষে স্কেল করে, অনুপাত বজায় রেখে।
11টি স্তর: 5টি স্ট্যান্ডার্ড (XS, S, M, L, XL) এবং 6টি অ্যাক্সেসিবিলিটি স্তর (AccessibilityXL থেকে AccessibilityXXXXXL পর্যন্ত)। body ফন্টের আকার 14px থেকে 53px পর্যন্ত হতে পারে।
UIKit-এ UIContentSizeCategory.didChangeNotification-এর মাধ্যমে। SwiftUI-তে, @Environment(\.dynamicTypeSize) ব্যবহার করুন — সিস্টেম সেটিং পরিবর্তন হলে ভিউ স্বয়ংক্রিয়ভাবে আপডেট হয়।
বর্ধিত ফন্টের ব্যবহারকারীরা কাটা টেক্সট, ওভারল্যাপিং উপাদান এবং ভাঙা বাটন দেখবেন। অ্যাক্সেসিবিলিটি প্রয়োজনীয়তা লঙ্ঘনের জন্য অ্যাপ App Store রিভিউতে প্রত্যাখ্যাত হতে পারে।
সারসংক্ষেপ
আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব
IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।
আরও পড়ুন