UITextView হল UIKit-এর একটি মাল্টিলাইন টেক্সট কম্পোনেন্ট, যা UIScrollView থেকে উত্তরাধিকার সূত্রে প্রাপ্ত এবং লিঙ্ক ও ছবি এম্বেড করে অ্যাট্রিবিউটেড টেক্সট সম্পাদনা সমর্থন করে। Apple Developer ডকুমেন্টেশন (2025) অনুযায়ী, UITextView ইন্টারঅ্যাকশন হ্যান্ডলিংয়ের জন্য textViewDidChange, shouldInteractWithURL এবং shouldInteractWithTextAttachment কলব্যাকসহ UITextViewDelegate প্রদান করে। UITextField-এর বিপরীতে, UITextView স্ক্রোলিং, typingAttributes-এর মাধ্যমে টেক্সট স্টাইল এবং লিঙ্ক, ঠিকানা ও তারিখের স্বয়ংক্রিয় সনাক্তকরণের জন্য dataDetectorTypes সমর্থন করে। iOS অ্যাপ্লিকেশনে কন্টেন্ট প্রদর্শন এবং মাল্টিলাইন টেক্সট ইনপুটের জন্য এটি প্রধান কম্পোনেন্ট।
মূল পয়েন্ট
UITextView হল একটি UIKit কম্পোনেন্ট যা মাল্টিলাইন টেক্সট প্রদর্শন এবং সম্পাদনার জন্য ডিজাইন করা হয়েছে। UILabel-এর বিপরীতে, UITextView টেক্সট নির্বাচন, সম্পাদনা, কন্টেন্ট আকার অতিক্রম করলে স্ক্রোলিং এবং অ্যাট্রিবিউটেড টেক্সট সমর্থন করে। UIScrollView-এর একটি সাবক্লাস হিসেবে, UITextView স্বয়ংক্রিয়ভাবে কন্টেন্ট ওভারফ্লো হলে উল্লম্ব এবং অনুভূমিক স্ক্রোলিং অন্তর্ভুক্ত করে — এটি isScrollEnabled-এর মাধ্যমে কনফিগার করা হয়। ক্লাসটি isEditable প্রপার্টির মাধ্যমে সম্পাদনা সমর্থন করে: শুধু-পঠন মোডের জন্য false সেট করুন। UITextView TextKit সিস্টেমের মাধ্যমে NSLayoutManager-এর সাথে কাজ করে: NSTextStorage (অ্যাট্রিবিউটেড টেক্সট স্টোরেজ) → NSLayoutManager (লাইন লেআউট) → NSTextContainer (টেক্সট এরিয়া জ্যামিতি)। এই আর্কিটেকচার ইমেজ র্যাপিং, মাল্টি-কলাম টেক্সট এবং জটিল টেক্সট লেআউটসহ কাস্টম লেআউটের অনুমতি দেয়। UITextView iOS-এ আর্টিকেল, বিবরণ, লগ, মন্তব্য এবং যেকোনো মাল্টিলাইন টেক্সট প্রদর্শনের জন্য ব্যবহৃত হয়।
UITextView এবং UITextField-এর মধ্যে পার্থক্য লাইনের সংখ্যার বাইরেও অনেক বেশি। UITextField হল প্লেসহোল্ডার, বাম/ডান ভিউ এবং ক্লিয়ার বাটনসহ একটি একক-লাইন UIControl। UITextView হল অ্যাট্রিবিউটেড টেক্সটের জন্য পূর্ণ TextKit সিস্টেমসহ একটি মাল্টিলাইন UIScrollView। UITextField প্রদর্শন স্তরে NSAttributedString সমর্থন করে না (শুধু সীমাবদ্ধতা সহ attributedText-এর মাধ্যমে), UITextView বিভিন্ন ফন্ট, প্যারাগ্রাফ স্টাইল এবং এম্বেডেড ছবিসহ NSAttributedString সম্পূর্ণরূপে হ্যান্ডল করে। UITextField-এ একটি বিল্ট-ইন ক্লিয়ার বাটন (clearButtonMode) আছে, UITextView-এ নেই — কাস্টম বাস্তবায়ন প্রয়োজন। UITextField স্বয়ংক্রিয়ভাবে কন্টেন্ট অনুযায়ী আকার পরিবর্তন করে (intrinsicContentSize), UITextView-এর contentSize পর্যবেক্ষণ বা Auto Layout কনস্ট্রেইন্টের মাধ্যমে ম্যানুয়াল উচ্চতা ব্যবস্থাপনা প্রয়োজন। UITextView dataDetectorTypes সমর্থন করে, UITextField এটি iOS 16+ থেকে সমর্থন করে। মাল্টিলাইন টেক্সট ইনপুটের (মন্তব্য, নোট, বার্তা) জন্য UITextView বেছে নিন। ফর্ম ফিল্ডের (নাম, ইমেল, পাসওয়ার্ড) জন্য UITextField ব্যবহার করুন।
| বৈশিষ্ট্য | UITextView | UITextField |
|---|---|---|
| লাইন | মাল্টিলাইন | একক-লাইন |
| Placeholder | না (কাস্টম) | বিল্ট-ইন |
| টেক্সট অ্যাট্রিবিউট | পূর্ণ NSAttributedString | সীমিত |
| Data Detectors | পূর্ণ সমর্থন | iOS 16+ |
| ইনলাইন ছবি | NSTextAttachment-এর মাধ্যমে | সমর্থিত নয় |
| স্ক্রোলিং | বিল্ট-ইন (UIScrollView) | না |
| বাম/ডান ভিউ | না | বিল্ট-ইন |
NSAttributedString UITextView-এর একটি মৌলিক ক্ষমতা যা এটিকে UITextField এবং UILabel থেকে আলাদা করে। একটি অ্যাট্রিবিউটেড স্ট্রিং একই টেক্সটের মধ্যে বিভিন্ন ফন্ট, রং, লাইন স্পেসিং, সারিবদ্ধকরণ এবং লিঙ্ক সেট করার অনুমতি দেয়। বৈশিষ্ট্য: textView.attributedText = attributedString. মূল NSAttributedString.Key অ্যাট্রিবিউট: font (.systemFont, .boldSystemFont, কাস্টম UIFont), foregroundColor, backgroundColor, paragraphStyle (lineSpacing, alignment, lineBreakMode সহ NSMutableParagraphStyle), link (ইন্টারঅ্যাকটিভ লিঙ্কের জন্য URL), underlineStyle, strikethroughStyle, shadow, baselineOffset, kern (অক্ষর স্পেসিং)। attributedString তৈরি করতে init(string:, attributes:) বা বিভিন্ন রেঞ্জে অ্যাট্রিবিউট যোগ করতে NSMutableAttributedString ব্যবহার করুন। UITextView স্বয়ংক্রিয়ভাবে লিঙ্ক (link অ্যাট্রিবিউট) ইন্টারঅ্যাকটিভ হিসেবে প্রদর্শন করে — চাপলে ডেলিগেট মেথড shouldInteractWithURL ট্রিগার হয়। নতুন ইনপুটের জন্য অ্যাট্রিবিউট রিসেট করতে typingAttributes ব্যবহার করুন।
import UIKit
let textView = UITextView()
textView.isEditable = false
textView.isScrollEnabled = true
textView.dataDetectorTypes = [.link, .phoneNumber]
let attributedString = NSMutableAttributedString(
string: "Visit our website or call +1-800-555-0199"
)
attributedString.addAttributes([
.font: UIFont.systemFont(ofSize: 16),
.foregroundColor: UIColor.label,
], range: NSRange(location: 0, length: 11))
let linkRange = (attributedString.string as NSString)
.range(of: "website")
attributedString.addAttributes([
.link: URL(string: "https://example.com")!,
.foregroundColor: UIColor.systemBlue,
], range: linkRange)
textView.attributedText = attributedString
UITextViewDelegate একটি প্রোটোকল যা সম্পাদনা এবং টেক্সটের সাথে ইন্টারঅ্যাকশন পরিচালনা করে। প্রধান মেথড: textViewDidBeginEditing(textView) — সম্পাদনা শুরু হলে কল হয়; textViewDidEndEditing — সম্পাদনা শেষ হলে; textViewDidChange — প্রতিটি টেক্সট পরিবর্তনে; textViewDidChangeSelection — নির্বাচন পরিবর্তনে; textViewShouldInteractWithURL — লিঙ্কে ট্যাপ করলে (Bool রিটার্ন করে, ট্রানজিশন অনুমতি দেয়); textViewShouldInteractWithTextAttachment — এম্বেডেড ছবিতে ট্যাপ করলে। UITextView-এর ভিতরে লিঙ্ক হ্যান্ডল করতে shouldInteractWithURL ওভাররাইড করুন — এতে আপনি: SFSafariViewController-এ URL খুলতে পারেন, নিশ্চিতকরণের জন্য UIAlertController দেখাতে পারেন, কাস্টম URL স্কিম হ্যান্ডল করতে পারেন। গুরুত্বপূর্ণ: যদি textView.isEditable = true হয়, লিঙ্ক একক ট্যাপের জন্য অনুপলব্ধ হয় — ডাবল ট্যাপ প্রয়োজন। এডিটেবল textView-এ ইন্টারঅ্যাকটিভ লিঙ্কের জন্য gesture recognizers ব্যবহার করুন।
SFSafariViewController iOS অ্যাপ্লিকেশনে লিঙ্ক খোলার মানক উপায়। shouldInteractWithURL মেথডে URL সহ SFSafariViewController তৈরি করুন এবং এটি মোডালি বা navigationController-এর মাধ্যমে উপস্থাপন করুন। ইউনিভার্সাল লিঙ্কের জন্য UIApplication.shared.open(url, options) ব্যবহার করুন — কিন্তু এটি অ্যাপ্লিকেশনের বাইরে চলে যায়। লিঙ্ক খোলা প্রতিরোধ করতে shouldInteractWithURL-এ false রিটার্ন করুন এবং URL নিজে হ্যান্ডল করুন।
NSTextContainer TextKit আর্কিটেকচারের অংশ, যা জ্যামিতিক এলাকা নির্ধারণ করে যেখানে UITextView টেক্সট প্রদর্শিত হয়। প্রতিটি UITextView-এ একটি স্ট্যান্ডার্ড textContainer থাকে, যা এর মাধ্যমে কনফিগারযোগ্য: textView.textContainerInset — textView প্রান্ত থেকে টেক্সট মার্জিন (UIEdgeInsets); textView.textContainer.lineFragmentPadding — প্রতিটি লাইনের ভিতরে অনুভূমিক প্যাডিং; textView.textContainer.maximumNumberOfLines — লাইন সীমা (0 = কোন সীমা নেই); textView.textContainer.exclusionPaths — UIBezierPath-এর অ্যারে সেই এলাকাগুলির জন্য যেগুলির চারপাশে টেক্সট প্রবাহিত হওয়া উচিত (ছবি, কাস্টম আকৃতি)। ExclusionPaths জটিল লেআউটের অনুমতি দেয়: টেক্সট একটি বৃত্তাকার প্রোফাইল ছবি, আইকন বা যেকোনো নির্বিচার আকৃতির চারপাশে প্রবাহিত হয়। গতিশীল UITextView উচ্চতার জন্য KVO বা ডেলিগেটের মাধ্যমে contentSize পর্যবেক্ষণ করুন এবং কনস্ট্রেইন্ট আপডেট করুন।
// Dynamic UITextView height via contentSize
func textViewDidChange(textView: UITextView) {
let fixedWidth = textView.frame.size.width
let newSize = textView.sizeThatFits(
CGSize(width: fixedWidth, height: CGFloat.greatestFiniteMagnitude)
)
heightConstraint.constant = newSize.height
UIView.animate(withDuration: 0.1) {
self.view.layoutIfNeeded()
}
}
// ExclusionPath for image wrapping
let imageFrame = CGRect(x: 16, y: 100, width: 80, height: 80)
let exclusionPath = UIBezierPath(rect: imageFrame)
textView.textContainer.exclusionPaths = [exclusionPath]
dataDetectorTypes UITextView-এর একটি বৈশিষ্ট্য যা টেক্সটে নির্দিষ্ট ডেটা প্রকার স্বয়ংক্রিয়ভাবে চিহ্নিত করে এবং ইন্টারঅ্যাকটিভ করে: .link (URL, ইমেল), .phoneNumber (ফোন নম্বর), .address (ঠিকানা), .calendarEvent (তারিখ এবং ঘটনা), .flightNumber (ফ্লাইট নম্বর), .lookupSuggestion (অনুসন্ধান পরামর্শ), .trackingNumber (ট্র্যাকিং নম্বর), .money (পরিমাণ), .shipmentTrackingNumber, .all (সব প্রকার)। Data Detector NSDataDetector এবং URL-এর সাথে কাজ করে, স্বয়ংক্রিয়ভাবে সনাক্ত করা ডেটা হাইলাইট করে। হ্যান্ডলিং কাস্টমাইজ করতে dataDetectorTypes সেট করুন এবং ডেলিগেটে shouldInteractWithURL ওভাররাইড করুন। গুরুত্বপূর্ণ: dataDetectorTypes অতিরিক্ত সেটআপ ছাড়া শুধু URL এবং phoneNumber-এর জন্য কাজ করে — অন্যান্য প্রকারের জন্য iOS 16+ প্রয়োজন হতে পারে। Data Detector NSAttributedString-এ link অ্যাট্রিবিউটের সাথে বিরোধ করে না — উভয় প্রক্রিয়া সমান্তরালে কাজ করে। কন্টেন্ট (সংবাদ, আর্টিকেল) সহ শুধু-পঠন UITextView-এর জন্য dataDetectorTypes = [.link, .phoneNumber] সেট করুন।
আসুন iOS অ্যাপ্লিকেশনে UITextView ব্যবহারের দুটি ব্যবহারিক উদাহরণ দেখি। প্রথমটি — কন্টেন্ট প্রদর্শনের জন্য অ্যাট্রিবিউটেড টেক্সট এবং ডেটা ডিটেক্টরসহ একটি শুধু-পঠন টেক্সট ভিউ। দ্বিতীয়টি — মন্তব্য ফর্মের জন্য আলস্য প্লেসহোল্ডার এবং গতিশীল উচ্চতাসহ একটি এডিটেবল টেক্সট ভিউ। উভয় উদাহরণ UIKit-এর সেরা অনুশীলন ব্যবহার করে: ডেলিগেট প্রোটোকল, Auto Layout এবং TextKit।
শুধু-পঠন মোড isEditable = false এবং isSelectable = true সেট করে সক্ষম করা হয়। এটি ব্যবহারকারীকে টেক্সট নির্বাচন এবং লিঙ্কে ট্যাপ করার অনুমতি দেয়, কিন্তু সম্পাদনা নয়। লিঙ্কের স্বয়ংক্রিয় সনাক্তকরণের জন্য dataDetectorTypes সেট করুন, স্বচ্ছ ব্যাকগ্রাউন্ডের জন্য backgroundColor = .clear। দীর্ঘ কন্টেন্টের জন্য পঠনযোগ্যতার জন্য NSMutableParagraphStyle lineSpacing-সহ attributedText ব্যবহার করুন। টেক্সটের ভিতরে মূল লিঙ্কের জন্য link অ্যাট্রিবিউট যোগ করুন।
import UIKit
class ArticleViewController: UIViewController {
let contentView = UITextView()
override func viewDidLoad() {
super.viewDidLoad()
contentView.isEditable = false
contentView.isSelectable = true
contentView.dataDetectorTypes = [.link, .phoneNumber]
contentView.backgroundColor = .clear
contentView.textContainerInset = UIEdgeInsets(
top: 8, left: 16,
bottom: 8, right: 16
)
contentView.delegate = self
loadArticleContent()
}
func loadArticleContent() {
guard let url = URL(string: "https://example.com/article")
else { return }
// Load content from URL and set attributedText
}
}
প্লেসহোল্ডার UITextView-এর জন্য বিল্ট-ইন নয় — এটি textView-এর উপরে UILabel-এর মাধ্যমে বা isEmpty চেকসহ attributedText-এর মাধ্যমে বাস্তবায়ন করুন। একটি সরল পদ্ধতি: ধূসর টেক্সটযুক্ত একটি UILabel যা সম্পাদনা শুরু হলে লুকিয়ে যায়। textViewDidChange-এ টেক্সটের উপস্থিতি পরীক্ষা করুন এবং প্লেসহোল্ডার লুকান/দেখান। আরও মার্জিত সমাধানের জন্য ইনপুট টেক্সটের রং সেট করতে typingAttributes বৈশিষ্ট্য ব্যবহার করুন। গতিশীল textView উচ্চতা contentSize পর্যবেক্ষণ এবং কনস্ট্রেইন্ট আপডেটের মাধ্যমে অর্জিত হয় — এটি চ্যাট এবং মন্তব্য ফর্মের জন্য একটি মানক প্যাটার্ন।
প্রায়শই জিজ্ঞাসিত প্রশ্ন
UITextView-এ বিল্ট-ইন প্লেসহোল্ডার নেই। মানক সমাধান: textView-এর উপরে ধূসর টেক্সটযুক্ত একটি UILabel যোগ করুন। textViewDidBeginEditing-এ লেবেল লুকান, textViewDidEndEditing-এ টেক্সট খালি থাকলে দেখান। বিকল্পভাবে: প্লেসহোল্ডার হিসেবে ধূসর রং-সহ attributedText ব্যবহার করুন এবং সম্পাদনা শুরু হলে রিসেট করুন। প্রস্তুত সমাধানের জন্য KMPlaceholderTextView লাইব্রেরি বা ReactorKit ব্যবহার করুন।
textContainerInset = .zero এবং lineFragmentPadding = 0 সেট করুন: textView.textContainerInset = UIEdgeInsets.zero; textView.textContainer.lineFragmentPadding = 0। অতিরিক্তভাবে: textView.contentInset = .zero। এটি textView-এর প্রান্ত থেকে টেক্সট পর্যন্ত মার্জিন সম্পূর্ণ সরিয়ে দেবে। মনে রাখবেন lineFragmentPadding ডিফল্ট 5।
পরীক্ষা করুন: isSelectable = true (ইন্টারঅ্যাকশনের জন্য প্রয়োজন), dataDetectorTypes-এ .link অন্তর্ভুক্ত, ডেলিগেট shouldInteractWithURL-এ false রিটার্ন করে না। যদি textView.isEditable = true হয়, লিঙ্ক একক ট্যাপের জন্য অনুপলব্ধ — ডাবল ট্যাপ প্রয়োজন। এডিটেবল textView-এ ইন্টারঅ্যাকটিভ লিঙ্কের জন্য textView-এর উপরে UITapGestureRecognizer যোগ করুন এবং URL ম্যানুয়ালি হ্যান্ডল করুন।
isScrollEnabled = true সেট করুন এবং একটি নির্দিষ্ট মানসহ উচ্চতা কনস্ট্রেইন্ট যোগ করুন। উচ্চতা অতিক্রমকারী টেক্সট স্ক্রোল হবে। সর্বোত্তম UX-এর জন্য maxHeight ব্যবহার করুন: contentSize পর্যবেক্ষণ করুন এবং উচ্চতা কনস্ট্রেইন্ট maxHeight-এর বেশি না সেট করুন। যখন maxHeight অতিক্রম করে তখন scrollEnabled সক্ষম করুন। এটি বার্তা এবং মন্তব্য ইনপুট ফিল্ডের জন্য একটি মানক প্যাটার্ন।
NSTextAttachment ব্যবহার করুন: একটি অবজেক্ট তৈরি করুন, ছবি এবং bounds সেট করুন, তারপর অ্যাটাচমেন্ট থেকে NSAttributedString তৈরি করুন এবং textView.attributedText-এ সন্নিবেশ করুন। উদাহরণ: let attachment = NSTextAttachment(); attachment.image = image; attachment.bounds = CGRect(x, y, width, height); let attributedString = NSAttributedString(attachment: attachment)। ছবিটি টেক্সটে ইনলাইন প্রদর্শিত হবে এবং এর সাথে স্ক্রোল হবে।
সারাংশ
আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব
IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।
আরও পড়ুন