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 एप्लिकेशन बनाता है। हम आपको सलाह देंगे और सर्वोत्तम समाधान प्रस्तावित करेंगे।
यह भी पढ़ें