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 میں نہیں — حسب ضرورت نفاذ کی ضرورت ہے۔ UITextView خود بخود مواد کے مطابق سائز بدلتا ہے (intrinsicContentSize)، UITextView کو contentSize کے مشاہدے یا Auto Layout کی پابندیوں کے ذریعے دستی بلندی کے انتظام کی ضرورت ہوتی ہے۔ UITextView dataDetectorTypes کو سپورٹ کرتا ہے، UITextField اسے iOS 16+ سے سپورٹ کرتا ہے۔ کثیر السطر متن کے ان پٹ (تبصرے، نوٹس، پیغامات) کے لیے UITextView کا انتخاب کریں۔ فارم فیلڈز (نام، ای میل، پاس ورڈ) کے لیے UITextField استعمال کریں۔
| خصوصیت | UITextView | UITextField |
|---|---|---|
| سطور | کثیر السطر | واحد سطر |
| پلیس ہولڈر | نہیں (حسب ضرورت) | بلٹ ان |
| متن کی خصوصیات | مکمل 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 میں انٹرایکٹو لنکس کے لیے textView کے اوپر UITapGestureRecognizer شامل کریں اور URLs کو دستی طور پر ہینڈل کریں۔
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 شامل کریں اور URLs کو دستی طور پر ہینڈل کریں۔
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 ایپلیکیشنز بناتا ہے۔ ہم آپ کو مشورہ دیں گے اور بہترین حل تجویز کریں گے۔
مزید پڑھیں