Attributed Text হল iOS SDK এর একটি প্রক্রিয়া, যা NSAttributedString এবং NSMutableAttributedString ক্লাস দ্বারা উপস্থাপিত, যা একটি টেক্সট স্ট্রিংয়ের বিভিন্ন অংশে একাধিক শৈলী প্রয়োগ করার অনুমতি দেয়। সাধারণ NSString এর বিপরীতে, Attributed String শুধু অক্ষর নয়, প্রতিটি পরিসরের জন্য একটি এত্ত্রিবুট অভিধানও সংরক্ষণ করে: ফন্ট, রঙ, লাইন ফারাক, ছায়া এবং সারিবদ্ধি। Apple Developer Documentation অনুযায়ী, Attributed String হল UILabel, UITextView এবং UITextField এ ফরম্যাটকৃত টেক্সট প্রদর্শনের ভিত্তি। WebKit বা তৃতীয় পক্ষের লাইব্রেরি ছাড়াই টেক্সট শৈলীকরণের এটি মানক উপায়।
মূখ্য বিষয়
NSAttributedString হল Foundation ফ্রেমওয়ার্কের একটি ক্লাস যা অক্ষর পরিসরের সাথে সংযুক্ত নামিত এত্ত্রিবুটের একটি সেট সহ একটি স্ট্রিং উপস্থাপন করে। প্রতিটি এত্ত্রিবুট একটি কী-মান জোড়া: কীটি একটি ধ্রুবক (NSFontAttributeName, NSForegroundColorAttributeName) দ্বারা সংজ্ঞায়িত, এবং মান হল সংশ্লিষ্ট অবজেক্ট (UIFont, UIColor)। NSRange এর মাধ্যমে এত্ত্রিবুটগুলি অক্ষরের একটি পরিসরে প্রয়োগ করা হয়।
ক্লাসটি সব আপল প্লেটফর্মে উপলব্ধ: iOS (2.0+), macOS, tvOS, watchOS। NSAttributedString অপরিবর্তনীয় — একবার তৈরি হলে, এর এত্ত্রিবুটগুলি স্থির থাকে। গতিশীল পরিবর্তনের জন্য NSMutableAttributedString ব্যবহৃত হয়, যা NSAttributedString থেকে উত্তরাধিকার পায় এবং setAttributes, addAttributes, addAttribute, removeAttribute মেথড যোগ করে।
NSString হল শৈলীকরণ তথ্য ছাড়া অক্ষরের একটি সরল স্ট্রিং। text এর মাধ্যমে UILabel এ প্রেরণ করা যেকোনো টেক্সট একটি একক ফন্ট, রঙ এবং আকারে প্রদর্শিত হয়। NSAttributedString, attributedText এর মাধ্যমে প্রেরণ করা হলে, প্রতিটি অক্ষরের নিজস্ব এত্ত্রিবুট থাকতে পারে। UILabel, UITextView এবং UITextField স্বচালিতভাবে NSAttributedString চিনতে পারে এবং এর এত্ত্রিবুট অনুযায়ী টেক্সট রেন্ডার করে।
আন্তরিকভাবে, NSAttributedString টেক্সট সহ একটি NSString এবং এত্ত্রিবুট পরিসরের একটি অ্যারে সংরক্ষণ করে। প্রতিটি পরিসর একটি NSRange গঠন এবং একটি এত্ত্রিবুট অভিধান দ্বারা উপস্থাপিত হয়। রেন্ডারিংয়ের সময়, সিস্টেম পরিসরগুলির মাধ্যমে অতিক্রম করে এবং প্রতিটি অংশে সংশ্লিষ্ট এত্ত্রিবুট প্রয়োগ করে। দক্ষতা এত্ত্রিবুট স্যাইচের সংখ্যার উপর নির্ভর করে — ছোট অংশে ঘন পরিবর্তন রেন্ডারিং সময় বাড়ায়।
NSAttributedString এর এত্ত্রিবুটগুলি হল UIKit (iOS) এবং AppKit (macOS) এ সংজ্ঞায়িত ধ্রুবক, প্রতিটি টেক্সটের ভিজুয়াল শৈলীকরণের একটি নির্দিষ্ট দিকের সাথে মেলে। সকল এত্ত্রিবুটি NSAttributedString.Key স্ট্রিং, এবং এগুলির মান নির্দিষ্ট ক্লাসের অবজেক্ট। এত্ত্রিবুটগুলি অক্ষর-স্তর (অক্ষরকে প্রভাবিত করে) এবং প্যারাগ্রাফ-স্তর (প্যারাগ্রাফকে প্রভাবিত করে) এ বিভক্ত।
অক্ষর-স্তরের এত্ত্রিবুটগুলি অন্তর্ভুক্ত করে ফন্ট (NSFontAttributeName), টেক্সট রঙ (NSForegroundColorAttributeName), পৃষ্ঠভূমি রঙ (NSBackgroundColorAttributeName), আইনলাইন (NSUnderlineStyleAttributeName), স্ট্রাইকথ্রু (NSStrikethroughStyleAttributeName), ছায়া (NSShadowAttributeName)। প্যারাগ্রাফ-স্তরের এত্ত্রিবুটগুলি NSParagraphStyleAttributeName এর মাধ্যমে সেট করা হয়, যা সারিবদ্ধি, ইন্ডেন্টেশন, লাইন ফারাক এবং ট্যাবুলেশন নিয়ন্ত্রণ করে।
NSLinkAttributeName টেক্সটে একটি ক্লিকক্ষম লিঙ্ক তৈরি করে: মান হল URL বা স্ট্রিং। UITextView ইন্টারাক্শন সক্ষম থাকলে একেবারে এই লিঙ্কগুলি হ্যান্ডেল করে। NSAttachmentAttributeName একটি NSTextAttachment — টেক্সটের মধ্যে একটি ছবি যা একটি ইনলাইন উপাদান হিসেবে প্রদর্শিত হয় — এম্বেড করার অনুমতি দেয়। এটি একটি স্ট্রিংয়ের মধ্যে আইকন, ইমোজি বা কাস্টম ভিউ সহ টেক্সট তৈরিতে ব্যবহৃত হয়।
প্রতিটি NSAttributedString এত্ত্রিবুটের একটি কড়াকাটি টাইপকৃত মান রয়েছে। iOS ডেভেলপমেন্টে সবচেয়ে বেশি ব্যবহৃত এত্ত্রিবুটগুলি দেখা যাক। ফন্ট একটি UIFont অবজেক্টের মাধ্যমে, রঙ UIColor এর মাধ্যমে, লাইন ফারাক NSMutableParagraphStyle এর মাধ্যমে নির্ধারিত করা হয়, যা একটি অবজেক্টে সারিবদ্ধি, ইন্ডেন্টেশন এবং ফারাক কনফিগার করার অনুমতি দেয়।
| এত্ত্রিবুট কী | মানের ধরন | উদ্দেশ্য |
|---|---|---|
| NSFontAttributeName | UIFont | টেক্সট ফন্ট |
| NSForegroundColorAttributeName | UIColor | টেক্সট রঙ |
| NSBackgroundColorAttributeName | UIColor | টেক্সটের পিছনে পৃষ্ঠভূমি রঙ |
| NSUnderlineStyleAttributeName | NSNumber (Int) | আইনলাইনের শৈলী |
| NSParagraphStyleAttributeName | NSParagraphStyle | প্যারাগ্রাফ সেটিংস |
| NSKernAttributeName | NSNumber (Float) | অক্ষর ফারাক (কার্নিং) |
NSParagraphStyle প্যারাগ্রাফ এত্ত্রিবুটের জন্য একটি কন্টেনার: alignment, lineSpacing, paragraphSpacing, firstLineHeadIndent, lineBreakMode, minimumLineHeight এবং অন্যান্য। এই প্যারামিটারগুলি সংশোধনের জন্য, একটি NSMutableParagraphStyle তৈরি করা হয়, কাঞ্ক্ষিত বৈশিষ্ট্যগুলি সেট করা হয়, এবং অবজেক্টটি NSParagraphStyleAttributeName এত্ত্রিবুটের মান হিসেবে প্রেরণ করা হয়। NSAttributedString এ লাইন ফারাক নিয়ন্ত্রণের এটি একমাত্র উপায়।
NSShadow টেক্সটে একটি ছায়া যোগ করার অনুমতি দেয়: প্যারামিটার shadowOffset, shadowBlurRadius, shadowColor ছায়ার অফসেট, ব্লার এবং রঙ নির্ধারণ করে। আইনলাইন এবং স্ট্রাইকথ্রু এত্ত্রিবুটগুলি শৈলী সম্মিশ্রণ গ্রহণ করে: NSUnderlineStyle.single, .double, .thick, .patternDash, .patternDot। লাইনের মোটাই এবং রঙের সাথে সরাসরি নিয়ন্ত্রণের জন্য NSUnderlineColorAttributeName এবং NSStrikethroughColorAttributeName ব্যবহৃত হয়।
Swift এ NSAttributedString তৈরি টেক্সট এবং একটি এত্ত্রিবুট অভিধান সহ একটি ইনিশিয়ালাইজারের মাধ্যমে, বা ধাপে ধাপে শৈলী প্রয়োগ সহ NSMutableAttributedString এর মাধ্যমে করা হয়। বেস পদ্ধতি হল সম্পূর্ণ টেক্সটের জন্য একটি এত্ত্রিবুট অভিধান সংজ্ঞায়িত করা, তারপর নির্দিষ্ট পরিসরের জন্য এত্ত্রিবুট যোগ করা বা সংশোধন করা।
একটি সহজ উদাহরণ — সম্পূর্ণ স্ট্রিংয়ের জন্য ফন্ট, রঙ এবং সারিবদ্ধি নির্ধারণ করা। এত্ত্রিবুট অভিধানটি NSAttributedString ইনিশিয়ালাইজারে পাশ করা হয়। অভিধানের কীগুলি NSAttributedString.Key ধ্রুবক, মানগুলি সংশ্লিষ্ট UIKit অবজেক্ট। এটি হল মৌলিক কেস যখন সম্পূর্ণ টেক্সট একরূপভাবে ফরম্যাট করা হয়।
let attributes: [NSAttributedString.Key: Any] = [
.font: UIFont.systemFont(ofSize: 16),
.foregroundColor: UIColor.darkGray,
.paragraphStyle: let style = NSMutableParagraphStyle()
style.alignment = .center
style.lineSpacing = 4
return style
]
let attributedString = NSAttributedString(
string: "Hello world",
attributes: attributes
)
label.attributedText = attributedString
টেক্সটটি systemFont 16, গাঢ় ধূসর রঙ, কেন্দ্র সারিবদ্ধি এবং 4pt লাইন ফারাক সহ প্রদর্শিত হবে। এই পদ্ধতিটি স্থির শিরোনাম এবং বাটনের জন্য সুবিধাজনক।
NSMutableAttributedString টেক্সটের বিভিন্ন অংশে বিভিন্ন শৈলী প্রয়োগের অনুমতি দেয়। মেথড addAttribute একটি পরিসরে একটি একক এত্ত্রিবুট যোগ করে, addAttributes এত্ত্রিবুটের একটি অভিধান যোগ করে। মেথড setAttributes একটি পরিসরের সকল বর্তমান এত্ত্রিবুট নতুন দ্বারা প্রতিস্থাপন করে। হাইলাইট সহ টেক্সট তৈরির এটি প্রধান উপকরণ।
let text = "Price: 1999 rubles"
let attributed = NSMutableAttributedString(string: text)
attributed.addAttribute(.foregroundColor,
value: UIColor.green, range: NSRange(location: 6, length: 4))
attributed.addAttribute(.font,
value: UIFont.boldSystemFont(ofSize: 20), range: NSRange(location: 6, length: 4))
label.attributedText = attributed
শব্দটি “1999” সবুজ এবং বোলড হবে, বাকি টেক্সট স্ট্যান্ডার্ড হবে। NSRange ম্যানুয়ালি গণনা করা হয় — অক্ষরে দৈর্ঘ্য সঠিকভাবে গণনা করা গুরুত্বপূর্ণ, বিশেষ করে ইমোজি এবং যৌগিক Unicode অক্ষরের সাথে কাজ করার সময়।
NSMutableAttributedString গতিশীলভাবে টেক্সট এবং এত্ত্রিবুট পরিবর্তনের জন্য মেথড প্রদান করে: append, insert, replace, delete, setAttributes, addAttribute, removeAttribute, enumerateAttributes। এটি বিভিন্ন উৎস থেকে টেক্সট তৈরি, শৈলী সম্মিশ্রণ এবং ইন্টারফেস ইভেন্টে সাড়া দেওয়ার অনুমতি দেয়।
অপরিবর্তনীয় NSAttributedString এর বিপরীতে, পরিবর্তনীয় সংস্করণ একটি নতুন অবজেক্ট না তৈরি করে বেসামগ্রি পরিবর্তনের অনুমতি দেয়। এটি টেক্সট এডিটর, চ্যাট এবং ফরমের জন্য অত্যন্ত গুরুত্বপূর্ণ যেখানে ব্যবহারকারী টেক্সট সম্পাদন করতে পারে এবং শৈলী সংরক্ষণ করা আবশ্যক।
মেসেঞ্জারে, প্রতিটি বার্তায় ব্যবহারকারীর নাম (বোলড ফন্ট), বার্তার টেক্সট (সাধারণ), সময় (ধূসর রঙ) থাকে। NSMutableAttributedString সংশ্লিষ্ট এত্ত্রিবুট সহ কাঞ্ক্ষিত ক্রমে অংশগুলি যোগ করে একটি স্ট্রিং একবারে তৈরির অনুমতি দেয়।
let result = NSMutableAttributedString()
let name = NSAttributedString(string: "Anna: ",
attributes: [.font: UIFont.boldSystemFont(ofSize: 15)])
let message = NSAttributedString(string: "Hello, how are you?",
attributes: [.font: UIFont.systemFont(ofSize: 15)])
let time = NSAttributedString(string: " 12:30",
attributes: [.foregroundColor: UIColor.gray])
result.append(name)
result.append(message)
result.append(time)
label.attributedText = result
ফলাফল হল তিনটি শৈলীকৃত অংশ সহ একটি একক স্ট্রিং। Append স্বচালিতভাবে NSRange গণনা করে, অবস্থানগুলি ম্যানুয়ালি গণনা করার প্রয়োজন নেই। এই পদ্ধতিটি যেকোনো সংখ্যক খণ্ডের জন্য প্রসারিত হয়।
enumerateAttributes(in:options:using:) মেথডটি নির্দিষ্ট অন্তরালে সকল এত্ত্রিবুট পরিসরের মাধ্যমে যায়। এটি ফরম্যাটিং বিশ্লেষণের জন্য দকারী: সকল লিঙ্ক খুঁজুন, নির্দিষ্ট এত্ত্রিবুটের রঙ পরিবর্তন করুন বা টেক্সট HTML এ এক্সপোর্ট করুন। ক্লোজারে বর্তমান অংশের এত্ত্রিবুট অভিধান এবং NSRange পাশ করা হয়।
UIKit এ টেক্সট প্রদর্শনের জন্য সকল মূল UI উপাদান attributedText বৈশিষ্ট্যের মাধ্যমে NSAttributedString সমর্থন করে। UILabel স্থির শৈলীকৃত টেক্সট প্রদর্শন করে, UITextView সম্পাদন এবং লিঙ্ক সমর্থন করে, UITextField প্লেসহোল্ডার এবং প্রবেশ করা টেক্সটের জন্য আলাদাভাবে এত্ত্রিবুট গ্রহণ করে।
UILabel শৈলীকৃত টেক্সট প্রদর্শনের জন্য সবচেয়ে হালকা উপাদান। এটি সকল অক্ষর-স্তরের এত্ত্রিবুট সমর্থন করে কিন্তু ক্লিকক্ষম লিঙ্ক স্বচালিতভাবে হ্যান্ডেল করে না (এর জন্য UITextView প্রয়োজন)। UILabel শিরোনাম, লেবেল এবং ছোট ফরম্যাটকৃত টেক্সটের জন্য আদর্শ।
UITextView NSLinkAttributeName হ্যান্ডেল করে এবং লিঙ্কগুলিকে ইন্টারাক্টিভ উপাদান হিসেবে প্রদর্শন করে। এই কার্যকরিতা সক্ষম করতে, isSelectable = true এবং isEditable = false সেট করুন। একটি লিঙ্ক টেপ করলে, ডিলিগেট textView(_:shouldInteractWith:in:interaction:) কল পায়। UITextView টেক্সটের মধ্যে ছবির জন্য NSTextAttachment ও সমর্থন করে।
let text = "Details on developer.apple.com"
let attributed = NSMutableAttributedString(string: text)
attributed.addAttribute(.link,
value: URL(string: "https://developer.apple.com")!,
range: NSRange(location: 0, length: text.count))
textView.attributedText = attributed
textView.isSelectable = true
textView.isEditable = false
isSelectable এবং isEditable সেট করার পর, টেক্সট এরিয়াটি একটি স্থির টেক্সট ব্লকের মতো আচরণ করে, কিন্তু লিঙ্কগুলি সক্রিয় থাকে। UITextViewDelegate টেপ করার সময় আচরণ নিয়ন্ত্রণ করে।
Core Text টেক্সট রেন্ডারিংয়ের জন্য Apple এর একটি নিম্ন-স্তরের ফ্রেমওয়ার্ক যা সরাসরি NSAttributedString এর সাথে কাজ করে। UIKit এর বিপরীতে, Core Text NSAttributedString কে সরাসরি ডিসপ্লে অবজেক্ট হিসেবে ব্যবহার করে না — বরং এটিকে CTFramesetter, তারপর CTFrame এ রূপান্তর করে এবং একটি Core Graphics প্রেক্ষাপটে রেন্ডার করে। এটি লাইন লেআউট এবং গ্লাইফের উপর সম্পূর্ণ নিয়ন্ত্রণ দেয়।
Core Text ব্যবহার কস্টম টেক্সট লেআউটের জন্য নিয়োজিত: কলাম, ইমেজ রেপিং, টেক্সট ঘূর্ণন, অ-স্ট্যান্ডার্ড লাইন ব্রেক। Core Text এর NSMutableParagraphStyle এ এমন এত্ত্রিবুট অন্তর্ভুক্ত রয়েছে যা UIKit এ নেই: kCTParagraphStyleSpecifierMaximumLineSpacing, kCTParagraphStyleSpecifierLineBreakMode অতিরিক্ত মোড সহ।
NSAttributedString UIKit এবং Core Text এর মধ্যে নির্বিঘ্নে স্থানান্তরিত হয়, কারণ উভয় ফ্রেমওয়ার্ক একই ধরণের সাথে কাজ করে। UIKit এত্ত্রিবুট (NSFontAttributeName, NSForegroundColorAttributeName) স্বচালিতভাবে Core Text দ্বারা চিনতে পারা যায়, এবং বিপরীতে — Core Text এত্ত্রিবুট (kCTFontAttributeName) UIKit দ্বারা পড়া হয়। এটি একই NSAttributedString অবজেক্টে সরল কাজের জন্য UIKit এবং কস্টম রেন্ডারিংয়ের জন্য Core Text ব্যবহারের অনুমতি দেয়।
সাধারণ জিজ্ঞাসা
NSString শৈলীকরণ তথ্য ছাড়া কেবল টেক্সট সংরক্ষণ করে। NSAttributedString প্রতিটি অক্ষর পরিসরের জন্য একটি এত্ত্রিবুট অভিধান সহ টেক্সট পরিপূর্ণ করে। text বৈশিষ্ট্যের মাধ্যমে UILabel এ প্রেরণ করা হলে, NSString প্লেন টেক্সট হিসেবে প্রদর্শিত হয়। NSAttributedString attributedText এর মাধ্যমে প্রেরণ করা হলে, সকল এত্ত্রিবুট প্রয়োগ করা হয়: একটি স্ট্রিংয়ে বিভিন্ন ফন্ট, রঙ এবং ফারাক।
একটি এত্ত্রিবুট অভিধান সহ addAttributes(_:range:) মেথড ব্যবহার করুন: addAttributes([.font: font, .foregroundColor: color], range: range)। একটি একক এত্ত্রিবুট যোগ বা পরিবর্তনের জন্য addAttribute(_:value:range:) ব্যবহার করুন। setAttributes মেথডটি পরিসরের সকল বর্তমান এত্ত্রিবুট প্রদান করা এত্ত্রিবুট দ্বারা প্রতিস্থাপন করে।
একটি NSMutableParagraphStyle তৈরি করুন, lineSpacing বৈশিষ্ট্য সেট করুন, তারপর এটি NSParagraphStyleAttributeName এত্ত্রিবুটের মান হিসেবে পাশ করুন। সম্পূর্ণ নিয়ন্ত্রণের জন্য, minimumLineHeight, maximumLineHeight, paragraphSpacing, lineBreakMode এবং alignment ও উপলব্ধ। ParagraphStyle লাইন ফারাক নিয়ন্ত্রণের একমাত্র উপায়।
হ্যাঁ, SwiftUI iOS 15+ এ Text(attributedString:) এর মাধ্যমে NSAttributedString সমর্থন করে। পুরানো সংস্করণে, UILabel বা UITextView এর সাথে UIViewRepresentable ব্যবহার করুন। SwiftUI Markdown-এর মতো সিনট্যাক্স সহ ডিক্লারেটিভ ফরম্যাটিংয়ের জন্য নিজস্ব AttributedString ধরন (SwiftUI, Foundation নয়) ও প্রদান করে।
boundingRect(with:options:context:) মেথড ব্যবহার করুন, যা দেওয়া এত্ত্রিবুট সহ স্ট্রিং প্রদর্শনের জন্য প্রয়োজনীয় CGRect ফেরত দেয়। options প্যারামিটার: [.usesLineFragmentOrigin, .usesFontLeading] লাইন ফারাক এবং ফন্ট মেট্রিক্স হিসাব করে। সীমিত লাইন সংখ্যা সহ UILabel এর জন্য, sizeThatFits ব্যবহার করুন।
সারাংশ
আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব
IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।
আরও পড়ুন