Dynamic Type: মূল ধারণা, টেক্সট স্টাইল এবং iOS-এ এটি কীভাবে কাজ করে

লেখক: IT Sectr প্রকাশিত: 2026-05-16 পড়ার সময়: 9 মিনিট

Dynamic Type একটি অন্তর্নির্মিত iOS বৈশিষ্ট্য যা ব্যবহারকারীর সিস্টেম সেটিংস অনুযায়ী অ্যাপে ফন্টের আকার স্বয়ংক্রিয়ভাবে পরিবর্তন করে। ব্যবহারকারী সেটিংস → ডিসপ্লে ও ব্রাইটনেস → টেক্সট সাইজে তাদের পছন্দের টেক্সট আকার সেট করে এবং Dynamic Type সমর্থনকারী সব অ্যাপ অতিরিক্ত কোনো পদক্ষেপ ছাড়াই মানিয়ে নেয়। Apple Human Interface Guidelines, 2024 অনুযায়ী, Dynamic Type সমর্থন App Store-এ প্রকাশের জন্য বাধ্যতামূলক, কারণ এটি iOS প্ল্যাটফর্মে অ্যাক্সেসিবিলিটির মৌলিক উপাদান

মূল বিষয়

  • Dynamic Type — সিস্টেম ফন্ট সাইজ সেটিংস অনুযায়ী টেক্সট স্বয়ংক্রিয়ভাবে স্কেল করার জন্য iOS প্রক্রিয়া
  • সমর্থন টেক্সট স্টাইল (UIFont.TextStyle) — body, headline, caption, title এবং অন্যান্যের মাধ্যমে প্রদান করা হয়
  • সিস্টেম XSmall থেকে AccessibilityXXXL পর্যন্ত 11টি স্তর সমর্থন করে
  • কাস্টম ফন্টের জন্য UIFontMetrics পদ্ধতি ব্যবহার করা হয়, যা body স্টাইলের সাপেক্ষে যেকোনো ফন্ট স্কেল করে
  • লেআউট অভিযোজিত হতে হবে — UIStackView, Auto Layout এবং ডায়নামিক সেল উচ্চতা বাধ্যতামূলক

iOS-এ Dynamic Type কী

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-এর বিবর্তনের ইতিহাস

Dynamic Type iOS 7-এ ফ্ল্যাট ডিজাইনের সাথে এসেছিল। iOS 10 UIFontMetrics-এর মাধ্যমে কাস্টম ফন্টের জন্য সমর্থন যোগ করে। iOS 11 অ্যাক্সেসিবিলিটি স্তর (AccessibilityXXXL পর্যন্ত) চালু করে। iOS 15 স্বয়ংক্রিয় সমর্থনসহ SwiftUI-তে Dynamic Type যোগ করে। প্রতিটি রিলিজের সাথে Apple প্রয়োজনীয়তা কঠোর করে: iOS 17 থেকে শুরু করে, Dynamic Type সমর্থন ছাড়া অ্যাপ App Store Connect-এ আপলোড করার সময় সতর্কতা পায়।

UIFont.TextStyle টেক্সট স্টাইল

iOS ডিফল্ট সেটিংয়ের জন্য 8টি টেক্সট স্টাইল প্রদান করে, প্রতিটির পূর্বনির্ধারিত আকার এবং ওজন রয়েছে:

স্টাইলধ্রুবকআকার (L)উদ্দেশ্য
Large Title.largeTitle34pxস্ক্রিনের প্রধান শিরোনাম
Title 1.title128pxসেকশনের শিরোনাম
Title 2.title222pxউপশিরোনাম
Title 3.title320pxকার্ডের শিরোনাম
Headline.headline17px (বোল্ড)জোর দেওয়ার জন্য বোল্ড
Body.body17pxপ্রধান টেক্সট
Callout.callout16pxসহায়ক টেক্সট
Caption 1.caption112pxছবির নিচে ক্যাপশন
Caption 2.caption211pxছোট ক্যাপশন
Footnote.footnote13pxপাদটীকা, টীকা

সঠিক স্টাইল ব্যবহার করা শুধু “চেহারা” সম্পর্কে নয়। UIFont.TextStyle.body AccessibilityXXXL মোডে 53px পর্যন্ত পৌঁছাতে পারে। যদি অ্যাপ body-র জন্য 17px-এর ফিক্সড ফন্ট ব্যবহার করে, তবে টেক্সট সেই ব্যবহারকারীদের জন্য অপঠনযোগ্য হয়ে যায় যারা ফন্টের আকার বাড়িয়েছেন।

স্টাইলের মাধ্যমে ভিজ্যুয়াল শ্রেণিবিন্যাস

Dynamic Type শুধু স্কেল করে না — এটি ভিজ্যুয়াল শ্রেণিবিন্যাস সংরক্ষণ করে। Large Title সবসময় Title 1 থেকে বড়, যা Body থেকে বড়, স্কেলিং স্তর যাই হোক না কেন। স্কেলিং সহগ ভিন্ন: শিরোনামগুলি প্রধান টেক্সটের তুলনায় বেশি আক্রমণাত্মকভাবে স্কেল করে, যাতে অ্যাক্সেসিবিলিটি স্তরেও শ্রেণিবিন্যাস বজায় থাকে।

স্কেলিং স্তর

iOS টেক্সট স্কেলিংয়ের 11টি স্তর সমর্থন করে, দুটি বিভাগে বিভক্ত:

  • স্ট্যান্ডার্ড আকার (5 স্তর): XS, S, M, L (ডিফল্ট), XL
  • অ্যাক্সেসিবিলিটি আকার (6 স্তর): accessibilityXL, accessibilityXXL, accessibilityXXXL, accessibilityXXXXL, accessibilityXXXXXL, accessibilityXXXXXXL

body স্টাইলের জন্য XS এবং AccessibilityXXXL-এর মধ্যে পার্থক্য 14px থেকে 53px পর্যন্ত — প্রায় 4×। 17px-এর জন্য ডিজাইন করা লেআউট 53px-এ পুরোপুরি ভেঙে যায়: টেক্সট উপচে পড়ে, বাটন ওভারল্যাপ করে, সেল সংঘর্ষ করে।

কোডে বর্তমান বিভাগ পরীক্ষা করুন:

swift
let category = UIApplication.shared.preferredContentSizeCategory
// .extraSmall, .small, .medium, .large, .extraLarge ...
if category.isAccessibilityCategory {
    // বিকল্প লেআউট সক্ষম করুন
}

traitCollection এবং টেক্সট আকার

টেক্সট আকার বিভাগ traitCollection.uiContentSizeCategory-এর মাধ্যমে উপলব্ধ। যখন সিস্টেম সেটিং পরিবর্তন হয়, iOS সব UIView-এ traitCollectionDidChange কল করে। এই পদ্ধতিতে, আপনাকে ফন্ট আপডেট করতে এবং লেআউট পুনঃগণনা করতে হবে। SwiftUI এটি স্বয়ংক্রিয়ভাবে করে — UIKit-এ ম্যানুয়াল সাবস্ক্রিপশন প্রয়োজন।

UICollectionView-এর জন্য, UICollectionViewCompositionalLayout ব্যবহার করুন — এটি স্বয়ংক্রিয়ভাবে স্ক্রিনের প্রস্থ এবং টেক্সট আকার অনুযায়ী কলামের সংখ্যা সমন্বয় করে। অ্যাক্সেসিবিলিটি স্তরে, দুই-কলাম থেকে এক-কলাম লেআউটে স্যুইচ করুন যাতে টেক্সট কাটা না যায় এবং উপাদান ওভারল্যাপ না হয়। শর্তসাপেক্ষ লেআউট ব্যবহার করুন: রেগুলার প্রস্থের জন্য — দুই কলাম, কমপ্যাক্ট বা অ্যাক্সেসিবিলিটির জন্য — এক কলাম।

UIKit-এ বাস্তবায়ন

UIKit-এ মৌলিক বাস্তবায়ন — UIFont.preferredFont(forTextStyle:)। এই পদ্ধতি বর্তমান সিস্টেম সেটিং অনুযায়ী স্কেল করা ফন্ট রিটার্ন করে:

swift
titleLabel.font = UIFont.preferredFont(forTextStyle: .headline)
bodyLabel.font = UIFont.preferredFont(forTextStyle: .body)

কাস্টম ফন্ট-এর জন্য, UIFontMetrics ব্যবহার করুন:

swift
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 এবং স্কেলিং বক্ররেখা

UIFontMetrics একই স্কেলিং বক্ররেখা ব্যবহার করে যা preferredFont ব্যবহার করে। আপনি fromTextStyle: .body, .headline ইত্যাদি নির্দিষ্ট করতে পারেন। প্রতিটি স্টাইলের নিজস্ব স্কেলিং সহগ রয়েছে। Body মধ্যমভাবে স্কেল করে, Large Title আক্রমণাত্মকভাবে স্কেল করে। যদি আপনার কাস্টম ফন্ট প্রধান টেক্সটের জন্য ব্যবহৃত হয়, .body ব্যবহার করুন।

SwiftUI-তে Dynamic Type

SwiftUI-তে, Dynamic Type সমর্থন ডিফল্টরূপে অন্তর্নির্মিত। সব সিস্টেম মডিফায়ার (.font(.body), .font(.title)) স্বয়ংক্রিয়ভাবে স্কেল করে। ডেভেলপারকে UIFont.preferredFont কল করার প্রয়োজন নেই।

উদাহরণ:

swift
Text("প্রধান টেক্সট")
    .font(.body)
    .lineLimit(nil)
    .minimumScaleFactor(0.5)

কাস্টম স্কেল-এর জন্য, DynamicTypeSize ব্যবহার করুন:

swift
@Environment(\.dynamicTypeSize) var dynamicTypeSize

var body: some View {
    Text("অভিযোজিত টেক্সট")
        .font(.body)
        .padding(dynamicTypeSize <= .large ? 8 : 16)
}

SwiftUI সিস্টেম টেক্সট আকার পরিবর্তন হলে স্বয়ংক্রিয়ভাবে ভিউ আপডেট করে — কোনো অতিরিক্ত নোটিফিকেশন সাবস্ক্রিপশনের প্রয়োজন নেই।

SwiftUI-তে Dynamic Type সীমিত করা

.font(.body) মডিফায়ার শুধুমাত্র সিস্টেম ফন্টের জন্য কাজ করে। SwiftUI-তে কাস্টম ফন্টের জন্য, UIFontMetrics-এর সাথে Font.custom ব্যবহার করুন। iOS 16 থেকে শুরু করে, SwiftUI @Environment-এ DynamicTypeSize সমর্থন করে, যা প্যাডিং এবং লেআউট অভিযোজনের অনুমতি দেয়।

বড় ফন্টের জন্য লেআউট অভিযোজন

Auto Layout Dynamic Type সমর্থনের জন্য একটি পূর্বশর্ত। ফিক্সড প্রস্থ এবং উচ্চতা (>=, <=) অ্যাক্সেসিবিলিটি আকারে ভেঙে যায়। UILabel-এর জন্য intrinsicContentSize ব্যবহার করুন — এটি বর্তমান ফন্ট আকারের জন্য স্বয়ংক্রিয়ভাবে উচ্চতা গণনা করে।

অভিযোজিত লেআউটের নিয়ম:

  • UIStackView distribution = fill এবং spacing >= 8 সহ — উপাদানগুলি পরবর্তী লাইনে স্থানান্তরিত হবে
  • UITableViewCell automaticDimension সহ — সেলের উচ্চতা কন্টেন্ট অনুযায়ী সমন্বয় হয়
  • UILabel-এ numberOfLines = 0 — টেক্সট কাটা হয় না বরং মোড়ানো হয়
  • edgeInsets সহ বাটন — traitCollection.preferredContentSizeCategory-এর মাধ্যমে অ্যাক্সেসিবিলিটি স্তরে প্যাডিং যোগ করুন

লম্বা টেক্সটের জন্য (যেমন নিবন্ধ, ব্যবহারের শর্তাবলী), UILabel-এ minimumScaleFactor সেট করুন — এটি শেষ উপায় হিসেবে টেক্সট ছোট করে যখন Auto Layout কন্টেন্ট ধারণ করতে পারে না। মান 0.5 মানে ফন্ট পছন্দের আকারের 50% পর্যন্ত সঙ্কুচিত হতে পারে।

আকার বিভাগ অনুযায়ী প্যাডিং সমন্বয়ের উদাহরণ:

swift
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 বাধ্যতামূলক।

Dynamic Type পরীক্ষা

Xcode সিমুলেটর টেক্সট আকার পরিবর্তনের অনুমতি দেয়: সিমুলেটর মেনুতে Settings → Accessibility → Display & Text Size → Larger Text-এ যান। সব 11টি স্তরের মধ্যে স্যুইচ করুন এবং যাচাই করুন টেক্সট কাটছে না, বাটন অ্যাক্সেসযোগ্য, এবং লেআউট ভাঙছে না।

স্বয়ংক্রিয় পরীক্ষা-র জন্য, XCUIApplication-এ contentSizeCategory সেটিং ব্যবহার করুন:

swift
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 বাগ বিশেষভাবে অ্যাক্সেসিবিলিটি স্তরে পাওয়া যায়, কারণ ডেভেলপাররা শুধুমাত্র স্ট্যান্ডার্ড আকার পরীক্ষা করে।

Accessibility Inspector: Dynamic Type যাচাই

Xcode Accessibility Inspector দেখায় নির্বাচিত উপাদান কোন ফন্ট ব্যবহার করে — ফিক্সড বা স্কেলযোগ্য। যদি উপাদান সিমুলেটরে টেক্সট আকার পরিবর্তনে সাড়া না দেয়, তাহলে ফিক্সড ফন্ট ব্যবহার হচ্ছে। এটি UIFont.preferredFont বা UIFontMetrics দিয়ে প্রতিস্থাপন করুন।

সচরাচর জিজ্ঞাসিত প্রশ্ন

সহজ ভাষায় iOS-এ Dynamic Type কী?

এটি সিস্টেম সাইজ সেটিংস অনুযায়ী অ্যাপে স্বয়ংক্রিয় টেক্সট স্কেলিং। ব্যবহারকারী সেটিংসে আকার পরিবর্তন করে — সব সমর্থিত অ্যাপ ডেভেলপারের অংশগ্রহণ ছাড়াই মানিয়ে নেয়।

Dynamic Type কি শুধুমাত্র সিস্টেম ফন্টের সাথে কাজ করে?

না। কাস্টম ফন্ট-এর জন্য, UIFontMetrics(scaledFont:) ব্যবহার করুন। এই পদ্ধতি যেকোনো ফন্টকে নির্দিষ্ট টেক্সট স্টাইলের সাপেক্ষে স্কেল করে, অনুপাত বজায় রেখে।

iOS কতটি স্কেলিং স্তর সমর্থন করে?

11টি স্তর: 5টি স্ট্যান্ডার্ড (XS, S, M, L, XL) এবং 6টি অ্যাক্সেসিবিলিটি স্তর (AccessibilityXL থেকে AccessibilityXXXXXL পর্যন্ত)। body ফন্টের আকার 14px থেকে 53px পর্যন্ত হতে পারে।

টেক্সট আকার পরিবর্তনের সাবস্ক্রিপশন কীভাবে নেবেন?

UIKit-এ UIContentSizeCategory.didChangeNotification-এর মাধ্যমে। SwiftUI-তে, @Environment(\.dynamicTypeSize) ব্যবহার করুন — সিস্টেম সেটিং পরিবর্তন হলে ভিউ স্বয়ংক্রিয়ভাবে আপডেট হয়।

Dynamic Type সমর্থন না করলে কী হবে?

বর্ধিত ফন্টের ব্যবহারকারীরা কাটা টেক্সট, ওভারল্যাপিং উপাদান এবং ভাঙা বাটন দেখবেন। অ্যাক্সেসিবিলিটি প্রয়োজনীয়তা লঙ্ঘনের জন্য অ্যাপ App Store রিভিউতে প্রত্যাখ্যাত হতে পারে।

সারসংক্ষেপ

  • Dynamic Type — সিস্টেম সেটিংস অনুযায়ী টেক্সট স্কেল করার জন্য iOS-এ অন্তর্নির্মিত প্রক্রিয়া; App Store-এর জন্য বাধ্যতামূলক
  • সিস্টেম ফন্টের জন্য UIFont.preferredFont(forTextStyle:) এবং কাস্টম ফন্টের জন্য UIFontMetrics ব্যবহার করুন
  • iOS 11টি স্তর সমর্থন করে — XS থেকে AccessibilityXXXXXL পর্যন্ত (body-র জন্য 14–53px)
  • SwiftUI-তে, Dynamic Type .font(.body) এবং @Environment(\.dynamicTypeSize)-এর মাধ্যমে স্বয়ংক্রিয়ভাবে কাজ করে
  • লেআউট অভিযোজিত হতে হবে: UIStackView, টেবিলে automaticDimension, numberOfLines = 0
  • সব 11টি স্তর পরীক্ষা করুন, বিশেষ করে অ্যাক্সেসিবিলিটি বিভাগগুলি — 70% লেআউট সেগুলিতে ভেঙে যায়
  • UIKit অ্যাপের জন্য UIContentSizeCategory.didChangeNotification-এ সাবস্ক্রিপশন বাধ্যতামূলক

আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব

IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।

প্রকল্প নিয়ে আলোচনা করুন

আরও পড়ুন