UITextView: यह क्या है, बहु-पंक्ति इनपुट और कार्य सिद्धांत

लेखक: IT Sectr प्रकाशित: 2026-07-07 पढ़ने का समय: 8 मिनट

UITextView UIKit का एक बहु-पंक्ति टेक्स्ट घटक है, जो UIScrollView से विरासत प्राप्त करता है और लिंक और छवियों को एम्बेड करके एट्रिब्यूटेड टेक्स्ट के संपादन का समर्थन करता है। Apple Developer दस्तावेज़ (2025) के अनुसार, UITextView इंटरैक्शन हैंडलिंग के लिए textViewDidChange, shouldInteractWithURL और shouldInteractWithTextAttachment कॉलबैक के साथ UITextViewDelegate प्रदान करता है। UITextField के विपरीत, UITextView स्क्रॉलिंग, typingAttributes के माध्यम से टेक्स्ट शैलियाँ और लिंक, पतों और तिथियों के स्वतः-पहचान के लिए dataDetectorTypes का समर्थन करता है। iOS एप्लिकेशन में सामग्री प्रदर्शित करने और बहु-पंक्ति टेक्स्ट इनपुट करने के लिए यह मुख्य घटक है।

मुख्य बिंदु

  • UITextView — UIKit में बहु-पंक्ति टेक्स्ट फ़ील्ड, संपादन समर्थन के साथ UIScrollView का उत्तराधिकारी
  • NSAttributedString — एट्रिब्यूटेड टेक्स्ट समर्थन: फ़ॉन्ट, रंग, पंक्ति अंतराल, लिंक
  • UITextViewDelegate — textViewDidChange, shouldInteractWithURL, didBeginEditing के माध्यम से प्रबंधन
  • Data Detector Types — टेक्स्ट में लिंक, पतों, तिथियों, फ़ोन नंबरों की स्वतः-पहचान
  • Text Container — कस्टम लेआउट के लिए textContainer, exclusionPaths और lineFragmentPadding प्रणाली

UITextView क्या है

UITextView एक UIKit घटक है जो बहु-पंक्ति टेक्स्ट प्रदर्शित करने और संपादित करने के लिए डिज़ाइन किया गया है। UILabel के विपरीत, UITextView टेक्स्ट चयन, संपादन, सामग्री आकार से अधिक होने पर स्क्रॉलिंग और एट्रिब्यूटेड टेक्स्ट का समर्थन करता है। UIScrollView का उपवर्ग होने के नाते, UITextView स्वचालित रूप से सामग्री के ओवरफ़्लो होने पर लंबवत और क्षैतिज स्क्रॉलिंग शामिल करता है — यह isScrollEnabled के माध्यम से कॉन्फ़िगर किया जाता है। क्लास isEditable प्रॉपर्टी के माध्यम से संपादन का समर्थन करता है: केवल-पढ़ने के मोड के लिए false पर सेट करें। UITextView TextKit प्रणाली के माध्यम से NSLayoutManager के साथ काम करता है: NSTextStorage (एट्रिब्यूटेड टेक्स्ट भंडारण) → NSLayoutManager (पंक्ति लेआउट) → NSTextContainer (टेक्स्ट क्षेत्र ज्यामिति)। यह आर्किटेक्चर छवि रैपिंग, बहु-स्तंभ टेक्स्ट और जटिल टेक्स्ट लेआउट के साथ कस्टम लेआउट की अनुमति देता है। UITextView का उपयोग iOS में लेख, विवरण, लॉग, टिप्पणियाँ और कोई भी बहु-पंक्ति टेक्स्ट प्रदर्शित करने के लिए किया जाता है।

UITextView बनाम UITextField: मुख्य अंतर

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 का उपयोग करें।

सुविधाUITextViewUITextField
पंक्तियाँबहु-पंक्तिएकल-पंक्ति
Placeholderनहीं (कस्टम)अंतर्निहित
टेक्स्ट गुणपूर्ण NSAttributedStringसीमित
Data Detectorsपूर्ण समर्थनiOS 16+
इनलाइन छवियाँNSTextAttachment के माध्यम सेसमर्थित नहीं
स्क्रॉलिंगअंतर्निहित (UIScrollView)नहीं
बाएँ/दाएँ दृश्यनहींअंतर्निहित

NSAttributedString और टेक्स्ट फ़ॉर्मेटिंग

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 का उपयोग करें।

swift
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 और लिंक हैंडलिंग

UITextViewDelegate एक प्रोटोकॉल है जो संपादन और टेक्स्ट के साथ इंटरैक्शन का प्रबंधन करता है। मुख्य विधियाँ: textViewDidBeginEditing(textView) — संपादन शुरू होने पर कॉल किया जाता है; textViewDidEndEditing — संपादन समाप्त होने पर; textViewDidChange — प्रत्येक टेक्स्ट परिवर्तन पर; textViewDidChangeSelection — चयन बदलने पर; textViewShouldInteractWithURL — लिंक पर टैप करने पर (Bool लौटाता है, संक्रमण की अनुमति देता है); textViewShouldInteractWithTextAttachment — एम्बेडेड छवि पर टैप करने पर। UITextView के अंदर लिंक संभालने के लिए shouldInteractWithURL को ओवरराइड करें — इसमें आप: SFSafariViewController में URL खोल सकते हैं, पुष्टि के लिए UIAlertController दिखा सकते हैं, कस्टम URL स्कीम संभाल सकते हैं। महत्वपूर्ण: यदि textView.isEditable = true, लिंक एकल टैप के लिए अनुपलब्ध हो जाते हैं — डबल टैप आवश्यक है। संपादन योग्य textView में इंटरैक्टिव लिंक के लिए gesture recognizers का उपयोग करें।

SFSafariViewController के माध्यम से लिंक हैंडलिंग

SFSafariViewController iOS एप्लिकेशन में लिंक खोलने का मानक तरीका है। shouldInteractWithURL विधि में URL के साथ SFSafariViewController बनाएँ और इसे मोडली या navigationController के माध्यम से प्रस्तुत करें। यूनिवर्सल लिंक के लिए UIApplication.shared.open(url, options) का उपयोग करें — लेकिन यह एप्लिकेशन से बाहर जाता है। लिंक खोलने से रोकने के लिए shouldInteractWithURL में false लौटाएँ और URL स्वयं संभालें।

Text Container प्रणाली: मार्जिन और Exclusion Paths

NSTextContainer TextKit आर्किटेक्चर का हिस्सा है, जो ज्यामितीय क्षेत्र को परिभाषित करता है जहाँ UITextView टेक्स्ट प्रदर्शित होता है। प्रत्येक UITextView में एक मानक textContainer होता है, जो इसके माध्यम से कॉन्फ़िगर करने योग्य है: textView.textContainerInset — textView किनारों से टेक्स्ट मार्जिन (UIEdgeInsets); textView.textContainer.lineFragmentPadding — प्रत्येक पंक्ति के अंदर क्षैतिज पैडिंग; textView.textContainer.maximumNumberOfLines — पंक्ति सीमा (0 = कोई सीमा नहीं); textView.textContainer.exclusionPaths — UIBezierPath की सरणी उन क्षेत्रों के लिए जिनके चारों ओर टेक्स्ट को प्रवाहित होना चाहिए (छवियाँ, कस्टम आकार)। ExclusionPaths जटिल लेआउट की अनुमति देते हैं: टेक्स्ट एक गोलाकार प्रोफ़ाइल चित्र, आइकन या किसी भी मनमाने आकार के चारों ओर प्रवाहित होता है। गतिशील UITextView ऊँचाई के लिए KVO या डेलीगेट के माध्यम से contentSize का निरीक्षण करें और बाधाओं को अपडेट करें।

swift
// 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]

Data Detector Types: स्वतः-पहचान

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] सेट करें।

  • .link — URL, ईमेल पते; नीले लिंक के रूप में प्रदर्शित होते हैं
  • .phoneNumber — फ़ोन नंबर; टैप करने पर कॉल क्रिया दिखाता है
  • .address — डाक पते; टैप करने पर Maps खुलता है
  • .calendarEvent — तिथियाँ और समय; टैप करने पर कैलेंडर इवेंट बनाता है
  • .flightNumber — उड़ान संख्याएँ (iOS 16+); त्वरित उड़ान जाँच

UITextView के साथ कोड उदाहरण

आइए iOS एप्लिकेशन में UITextView के उपयोग के दो व्यावहारिक उदाहरण देखें। पहला — सामग्री प्रदर्शित करने के लिए एट्रिब्यूटेड टेक्स्ट और डेटा डिटेक्टर के साथ केवल-पढ़ने वाला टेक्स्ट व्यू। दूसरा — टिप्पणी प्रपत्र के लिए आलसी प्लेसहोल्डर और गतिशील ऊँचाई के साथ संपादन योग्य टेक्स्ट व्यू। दोनों उदाहरण UIKit की सर्वोत्तम प्रथाओं का उपयोग करते हैं: डेलीगेट प्रोटोकॉल, Auto Layout और TextKit।

सामग्री और लिंक के साथ केवल-पढ़ने वाला UITextView

केवल-पढ़ने का मोड isEditable = false और isSelectable = true सेट करके सक्षम किया जाता है। यह उपयोगकर्ता को टेक्स्ट चुनने और लिंक पर टैप करने की अनुमति देता है, लेकिन संपादन नहीं। लिंक की स्वतः-पहचान के लिए dataDetectorTypes सेट करें, पारदर्शी पृष्ठभूमि के लिए backgroundColor = .clear। लंबी सामग्री के लिए पठनीयता के लिए NSMutableParagraphStyle lineSpacing के साथ attributedText का उपयोग करें। टेक्स्ट के अंदर मुख्य लिंक के लिए link गुण जोड़ें।

swift
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

प्लेसहोल्डर UITextView के लिए अंतर्निहित नहीं है — इसे textView के ऊपर UILabel के माध्यम से या isEmpty जाँच के साथ attributedText के माध्यम से कार्यान्वित करें। एक सरल दृष्टिकोण: ग्रे टेक्स्ट वाला UILabel जो संपादन शुरू होने पर छिप जाता है। textViewDidChange में टेक्स्ट की उपस्थिति की जाँच करें और प्लेसहोल्डर को छिपाएँ/दिखाएँ। अधिक सुरुचिपूर्ण समाधान के लिए इनपुट टेक्स्ट का रंग सेट करने के लिए typingAttributes गुण का उपयोग करें। गतिशील textView ऊँचाई contentSize का निरीक्षण करके और बाधाओं को अपडेट करके प्राप्त की जाती है — यह चैट और टिप्पणी प्रपत्रों के लिए एक मानक पैटर्न है।

अक्सर पूछे जाने वाले प्रश्न

UITextView में प्लेसहोल्डर कैसे जोड़ें?

UITextView में अंतर्निहित प्लेसहोल्डर नहीं है। मानक समाधान: textView के ऊपर ग्रे टेक्स्ट वाला UILabel जोड़ें। textViewDidBeginEditing में लेबल छिपाएँ, textViewDidEndEditing में यदि टेक्स्ट खाली है तो दिखाएँ। वैकल्पिक रूप से: प्लेसहोल्डर के रूप में ग्रे रंग के साथ attributedText का उपयोग करें और संपादन शुरू होने पर इसे रीसेट करें। तैयार समाधान के लिए KMPlaceholderTextView लाइब्रेरी या ReactorKit का उपयोग करें।

UITextView में मार्जिन कैसे हटाएँ?

textContainerInset = .zero और lineFragmentPadding = 0 सेट करें: textView.textContainerInset = UIEdgeInsets.zero; textView.textContainer.lineFragmentPadding = 0. अतिरिक्त रूप से: textView.contentInset = .zero। यह textView के किनारों से टेक्स्ट तक के मार्जिन को पूरी तरह से हटा देगा। ध्यान दें कि lineFragmentPadding डिफ़ॉल्ट रूप से 5 है।

UITextView लिंक क्यों नहीं खोल रहा है?

जाँच करें: isSelectable = true (इंटरैक्शन के लिए आवश्यक), dataDetectorTypes में .link शामिल है, डेलीगेट shouldInteractWithURL में false नहीं लौटाता है। यदि textView.isEditable = true, लिंक एकल टैप के लिए अनुपलब्ध हैं — डबल टैप आवश्यक है। संपादन योग्य textView में इंटरैक्टिव लिंक के लिए textView के ऊपर UITapGestureRecognizer जोड़ें और URL को मैन्युअल रूप से संभालें।

स्क्रॉलिंग के साथ निश्चित ऊँचाई का UITextView कैसे बनाएँ?

isScrollEnabled = true सेट करें और एक निश्चित मान के साथ ऊँचाई बाधा जोड़ें। ऊँचाई से अधिक टेक्स्ट स्क्रॉल होगा। इष्टतम UX के लिए maxHeight का उपयोग करें: contentSize का निरीक्षण करें और ऊँचाई बाधा को maxHeight से अधिक न सेट करें। जब maxHeight पार हो जाए तो scrollEnabled सक्षम करें। यह संदेश और टिप्पणी इनपुट फ़ील्ड के लिए एक मानक पैटर्न है।

UITextView में छवि कैसे डालें?

NSTextAttachment का उपयोग करें: एक ऑब्जेक्ट बनाएँ, छवि और bounds सेट करें, फिर अटैचमेंट से NSAttributedString बनाएँ और textView.attributedText में डालें। उदाहरण: let attachment = NSTextAttachment(); attachment.image = image; attachment.bounds = CGRect(x, y, width, height); let attributedString = NSAttributedString(attachment: attachment). छवि टेक्स्ट में इनलाइन दिखाई देगी और उसके साथ स्क्रॉल होगी।

सारांश

  • UITextView — UIKit में बहु-पंक्ति टेक्स्ट घटक, TextKit समर्थन के साथ UIScrollView का उत्तराधिकारी
  • NSAttributedString — फ़ॉन्ट, रंग, लिंक और पैराग्राफ फ़ॉर्मेट करने की मुख्य क्षमता
  • UITextViewDelegate — संपादन प्रबंधन और लिंक एवं अटैचमेंट टैप की हैंडलिंग
  • Data Detector Types — NSDataDetector के माध्यम से URL, फ़ोन, पतों और तिथियों की स्वतः-पहचान
  • Text Container — लेआउट के लिए exclusionPaths, lineFragmentPadding और textContainerInset के साथ प्रणाली
  • Placeholder — अंतर्निहित नहीं, UILabel या ग्रे रंग के साथ attributedText के माध्यम से कार्यान्वित
  • गतिशील ऊँचाई — स्वतः-ऊँचाई के लिए contentSize निरीक्षण और बाधा अपडेट
  • UITextView बहु-पंक्ति, गुण, स्क्रॉलिंग और डेटा डिटेक्टर के समर्थन में UITextField से भिन्न है

हम एक मोबाइल एप्लिकेशन टर्नकी विकसित करेंगे

IT Sectr 2017 से स्टार्टअप और व्यवसायों के लिए iOS और Android एप्लिकेशन बनाता है। हम आपको सलाह देंगे और सर्वोत्तम समाधान प्रस्तावित करेंगे।

परियोजना पर चर्चा करें

यह भी पढ़ें