UITextView: bu nima, ko'p qatorli kiritish va ishlash prinsipi

Muallif: IT Sectr Nashr etilgan: 2026-07-07 O'qish vaqti: 8 daq

UITextView — UIKit-ning ko'p qatorli matn komponenti bo'lib, UIScrollView dan meros oladi va havolalar hamda rasmlarni qo'shib atributlangan matnni tahrirlashni qo'llab-quvvatlaydi. Apple Developer (2025) hujjatlariga ko'ra, UITextView textViewDidChange, shouldInteractWithURL va shouldInteractWithTextAttachment callbacklari bilan UITextViewDelegate ni taqdim etadi. UITextField dan farqli o'laroq, UITextView aylantirishni, typingAttributes orqali matn uslublarini va havolalar, manzillar hamda sanalarni avtomatik aniqlash uchun dataDetectorTypes ni qo'llab-quvvatlaydi. Bu iOS ilovalarida kontentni ko'rsatish va ko'p qatorli matn kiritish uchun asosiy komponentdir.

Asosiy

  • UITextView — tahrirlash qo'llab-quvvatlovi bilan UIScrollView vorisi bo'lgan UIKit-ning ko'p qatorli matn maydoni
  • NSAttributedString — atributlangan matn qo'llab-quvvati: shriftlar, ranglar, qator oralari, havolalar
  • UITextViewDelegate — textViewDidChange, shouldInteractWithURL, didBeginEditing orqali boshqarish
  • Data Detector Types — matnda havolalar, manzillar, sanalar, telefon raqamlarini avtomatik aniqlash
  • Text Container — maxsus joylashuv uchun textContainer, exclusionPaths va lineFragmentPadding tizimi

UITextView nima

UITextView — ko'p qatorli matnni ko'rsatish va tahrirlash uchun mo'ljallangan UIKit komponentidir. UILabel dan farqli o'laroq, UITextView matnni tanlash, tahrirlash, o'lchamdan oshganda aylantirish va atributlangan matnni qo'llab-quvvatlaydi. UIScrollView vorisi sifatida, UITextView kontent oshganda avtomatik vertikal va gorizontal aylantirishni yoqadi — bu isScrollEnabled orqali sozlanadi. Sinf tahrirlashni isEditable xususiyati orqali qo'llab-quvvatlaydi: faqat o'qish rejimi uchun false qo'ying. UITextView TextKit tizimi orqali NSLayoutManager bilan ishlaydi: NSTextStorage (atributlangan matnni saqlash) → NSLayoutManager (qatorlarni joylashtirish) → NSTextContainer (matn maydoni geometriyasi). Bu arxitektura rasmlar atrofida oqish, ko'p ustunli matn va murakkab matn joylashuvlarini yaratishga imkon beradi. UITextView iOS da maqolalar, tavsiflar, loglar, sharhlar va har qanday ko'p qatorli matnni ko'rsatish uchun ishlatiladi.

UITextView vs UITextField: asosiy farqlar

UITextView va UITextField o'rtasidagi farq qatorlar sonidan ancha kengdir. UITextField — placeholder, left/right view va tozalash tugmasi qo'llab-quvvatlovi bilan bir qatorli UIControl. UITextView — atributlangan matn uchun to'liq TextKit tizimiga ega ko'p qatorli UIScrollView. UITextField NSAttributedString ni ko'rsatish darajasida qo'llab-quvvatlamaydi (faqat cheklovlar bilan attributedText orqali), UITextView NSAttributedString ni turli shriftlar, paragraf uslublari va o'rnatilgan rasmlar bilan to'liq qayta ishlaydi. UITextField o'rnatilgan tozalash tugmasiga ega (clearButtonMode), UITextView da yo'q — maxsus amalga oshirish talab qilinadi. UITextField avtomatik o'lchamini kontentga moslashtiradi (intrinsicContentSize), UITextView contentSize kuzatuvi yoki Auto Layout cheklovlari orqali balandlikni qo'lda boshqarishni talab qiladi. UITextView dataDetectorTypes ni qo'llab-quvvatlaydi (havolalarni avtomatik aniqlash), UITextField uni iOS 16+ dan qo'llab-quvvatlaydi. Ko'p qatorli matn kiritish uchun (sharhlar, eslatmalar, xabarlar) UITextView ni tanlang. Forma maydonlari uchun (ism, email, parol) UITextField dan foydalaning.

ImkoniyatUITextViewUITextField
QatorlarKo'p qatorliBir qatorli
PlaceholderYo'q (maxsus)O'rnatilgan
Matn atributlariTo'liq NSAttributedStringCheklangan
Data DetectorsTo'liq qo'llab-quvvatlashiOS 16+
Inline rasmlarNSTextAttachment orqaliQo'llab-quvvatlanmaydi
AylantirishO'rnatilgan (UIScrollView)Yo'q
Left/Right ViewYo'qO'rnatilgan

NSAttributedString va matnni formatlash

NSAttributedString — UITextView ning UITextField va UILabel dan farqlovchi asosiy imkoniyatidir. Atributlangan qator bir matn ichida turli shriftlar, ranglar, qator oralari, tekislash va havolalarni o'rnatishga imkon beradi. Xususiyatlar: textView.attributedText = attributedString. NSAttributedString.Key ning asosiy atributlari: font (.systemFont, .boldSystemFont, maxsus UIFont), foregroundColor, backgroundColor, paragraphStyle (lineSpacing, alignment, lineBreakMode bilan NSMutableParagraphStyle), link (interaktiv havolalar uchun URL), underlineStyle, strikethroughStyle, shadow, baselineOffset, kern (harflar oralig'i). attributedString yaratish uchun init(string:, attributes:) yoki turli diapazonlarga atributlar qo'shish uchun NSMutableAttributedString dan foydalaning. UITextView havolalarni (link attribute) avtomatik interaktiv qilib ko'rsatadi — bosilganda shouldInteractWithURL delegat metodi chaqiriladi. Yangi kiritish uchun atributlarni tiklash uchun typingAttributes dan foydalaning.

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 delegati va havolalarni qayta ishlash

UITextViewDelegate — tahrirlash va matn bilan o'zaro aloqani boshqaruvchi protokol. Asosiy metodlar: textViewDidBeginEditing(textView) — tahrirlash boshlanganda chaqiriladi; textViewDidEndEditing — tugaganda; textViewDidChange — har matn o'zgarishida; textViewDidChangeSelection — tanlov o'zgarganda; textViewShouldInteractWithURL — havola bosilganda (Bool qaytaradi, o'tishga ruxsat berilganmi); textViewShouldInteractWithTextAttachment — o'rnatilgan rasm bosilganda. UITextView ichidagi havolalarni qayta ishlash uchun shouldInteractWithURL ni qayta yozing — unda: URL ni SFSafariViewController da ochish, tasdiqlash uchun UIAlertController ko'rsatish, maxsus URL sxemalarini qayta ishlash mumkin. Muhim: agar textView.isEditable = true bo'lsa, havolalar ikki marta bosilguncha bosish uchun mavjud emas — tahrirlash vaqtida interaktiv havolalar uchun gesture recognizers dan foydalaning.

SFSafariViewController orqali havolalarni qayta ishlash

SFSafariViewController — iOS ilovalarida havolalarni ochishning standart usuli. shouldInteractWithURL metodida URL bilan SFSafariViewController yarating va uni modal yoki navigationController orqali taqdim eting. Universal havolalar uchun UIApplication.shared.open(url, options) dan foydalaning — lekin bu ilovadan tashqariga chiqadi. Havolalarni ochishni taqiqlash uchun shouldInteractWithURL da false qaytaring va URL ni o'zingiz qayta ishlang.

Text Container tizimi: chekinishlar va exclusionPaths

NSTextContainer — TextKit arxitekturasining bir qismi, UITextView matni ko'rsatiladigan geometrik maydonni belgilaydi. Har bir UITextView standart textContainer ga ega, sozlanadi: textView.textContainerInset — matnning textView chegaralaridan chekinishi (UIEdgeInsets); textView.textContainer.lineFragmentPadding — har bir qator ichidagi gorizontal chekinish; textView.textContainer.maximumNumberOfLines — qatorlar soni cheklovi (0 = cheksiz); textView.textContainer.exclusionPaths — matn aylanib o'tishi kerak bo'lgan maydonlar uchun UIBezierPath massivi (rasmlar, maxsus shakllar). ExclusionPaths murakkab joylashuv yaratishga imkon beradi: matn dumaloq profil rasmi, ikonka yoki istalgan kontur atrofida oqadi. UITextView ning dinamik o'lchami uchun contentSize ni KVO yoki delegat orqali kuzating va cheklovlarni yangilang.

swift
// contentSize orqali dinamik UITextView balandligi
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()
    }
}

// Rasmlarni o'rash uchun ExclusionPath
let imageFrame = CGRect(x: 16, y: 100, width: 80, height: 80)
let exclusionPath = UIBezierPath(rect: imageFrame)
textView.textContainer.exclusionPaths = [exclusionPath]

Data Detector Types: ma'lumotlarni avtomatik aniqlash

dataDetectorTypes — UITextView xususiyati bo'lib, matndagi ma'lum ma'lumot turlarini avtomatik taniydi va interaktiv qiladi: .link (URL, email), .phoneNumber (telefon raqamlari), .address (manzillar), .calendarEvent (sanalar va voqealar), .flightNumber (parvoz raqamlari), .lookupSuggestion (qidiruv takliflari), .trackingNumber (kuzatuv raqamlari), .money (summalar), .shipmentTrackingNumber, .all (barcha turlar). Data Detector NSDataDetector va URL bilan ishlaydi, aniqlangan ma'lumotlarni avtomatik ajratib ko'rsatadi. Qayta ishlashni sozlash uchun dataDetectorTypes ni o'rnating va delegatda shouldInteractWithURL ni qayta yozing. Muhim: dataDetectorTypes qo'shimcha sozlashsiz faqat URL va phoneNumber uchun ishlaydi — qolgan turlar iOS 16+ talab qilishi mumkin. Data Detector NSAttributedString dagi link attribute bilan zid kelmaydi — ikkala mexanizm parallel ishlaydi. Kontentli (yangiliklar, maqolalar) faqat o'qish UITextView uchun dataDetectorTypes = [.link, .phoneNumber] o'rnating.

  • .link — URL, email manzillar; ko'k havolalar sifatida ko'rsatiladi
  • .phoneNumber — telefon raqamlari; bosilganda Call harakati ko'rsatiladi
  • .address — pochta manzillari; bosilganda Maps ochiladi
  • .calendarEvent — sanalar va vaqt; bosilganda kalendar hodisasi yaratiladi
  • .flightNumber — parvoz raqamlari (iOS 16+); parvozni tezkor tekshirish

UITextView bilan kod namunalari

iOS ilovalarida UITextView dan foydalanishning ikkita amaliy namunasini ko'rib chiqaylik. Birinchisi — kontentni ko'rsatish uchun atributlangan matn va data detector bilan faqat o'qish text view. Ikkinchisi — sharh formasi uchun dangasa placeholder va dinamik balandlik bilan tahrirlanadigan text view. Ikkala namuna best practices UIKit dan foydalanadi: delegat protokoli, Auto Layout va TextKit.

Kontent va havolalar bilan faqat o'qish UITextView

Faqat o'qish rejimi isEditable = false va isSelectable = true o'rnatish bilan yoqiladi. Bu foydalanuvchiga matnni tanlash va havolalarni bosish imkonini beradi, lekin tahrirlashni emas. Havolalarni avtomatik aniqlash uchun dataDetectorTypes, shaffof fon uchun backgroundColor = .clear o'rnating. Uzun kontentni ko'rsatish uchun o'qish qulayligi uchun NSMutableParagraphStyle lineSpacing bilan attributedText dan foydalaning. Matndagi asosiy havolalar uchun link attributes qo'shing.

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 }
        // URL dan kontentni yukla va attributedText o'rnat
    }
}

Placeholder bilan tahrirlanadigan UITextView

Placeholder UITextView uchun o'rnatilgan emas — uni textView ustidagi UILabel yoki isEmpty tekshiruvi bilan attributedText orqali amalga oshiring. Oddiy yondashuv: tahrirlash boshlanganda yashirinadigan kulrang matnli UILabel. textViewDidChange da matn mavjudligini tekshiring va placeholder ni yashiring/ko'rsating. Yana nafis yechim uchun kiritilayotgan matn rangini o'rnatish uchun typingAttributes xususiyatidan foydalaning. textView ning dinamik balandligi contentSize kuzatuvi va cheklovlarni yangilash orqali erishiladi — bu chatlar va sharh formalari uchun standart naqshdir.

Tez-tez beriladigan savollar

UITextView ga placeholder qanday qo'shiladi?

UITextView o'rnatilgan placeholder ga ega emas. Standart yechim: textView ustida kulrang matnli UILabel qo'shing. textViewDidBeginEditing da label ni yashiring, textViewDidEndEditing da matn bo'sh bo'lsa ko'rsating. Alternativ: placeholder sifatida kulrang rangli attributedText dan foydalaning va tahrirlash boshlanganda tiklang. Tayyor yechim uchun KMPlaceholderTextView yoki ReactorKit kutubxonasidan foydalaning.

UITextView da chekinishlarni qanday olib tashlash mumkin?

textContainerInset = .zero va lineFragmentPadding = 0 o'rnating: textView.textContainerInset = UIEdgeInsets.zero; textView.textContainer.lineFragmentPadding = 0. Qo'shimcha: textView.contentInset = .zero. Bu textView chetlaridan matngacha bo'lgan barcha chekinishlarni butunlay olib tashlaydi. E'tibor bering, lineFragmentPadding standartda 5 ga teng.

Nega UITextView havolalarni ochmaydi?

Tekshiring: isSelectable = true (o'zaro aloqa uchun zarur), dataDetectorTypes .link ni o'z ichiga oladi, delegat shouldInteractWithURL da false qaytarmaydi. Agar textView.isEditable = true bo'lsa, havolalar bir marta bosish uchun mavjud emas — ikki marta bosish talab qilinadi. Tahrirlanadigan textView da interaktiv havolalar uchun textView ustiga UITapGestureRecognizer qo'shing va URL ni qo'lda qayta ishlang.

Aylantirish bilan qattiq balandlikdagi UITextView qanday yaratiladi?

isScrollEnabled = true o'rnating va qattiq qiymat bilan height constraint qo'shing. Balandlikdan oshgan matn aylantiriladi. Optimal UX uchun maxHeight dan foydalaning: contentSize ni kuzating va height constraint ni maxHeight dan yuqori o'rnatmang. maxHeight dan oshganda scrollEnabled ni yoqing. Bu xabar va sharh kiritish maydonlari uchun standart naqshdir.

UITextView ga rasm qanday qo'yiladi?

NSTextAttachment dan foydalaning: obyekt yarating, image va bounds o'rnating, so'ngra attachment dan NSAttributedString yarating va textView.attributedText ga qo'shing. Misol: let attachment = NSTextAttachment(); attachment.image = image; attachment.bounds = CGRect(x, y, width, height); let attributedString = NSAttributedString(attachment: attachment). Rasm matn ichida inline ko'rsatiladi va u bilan birga aylanadi.

Xulosa

  • UITextView — TextKit qo'llab-quvvatlovi bilan UIScrollView vorisi bo'lgan ko'p qatorli UIKit matn komponenti
  • NSAttributedString — shriftlar, ranglar, havolalar va paragraflarni formatlash uchun asosiy imkoniyat
  • UITextViewDelegate — tahrirlashni boshqarish va havolalar hamda qo'shimchalarga bosishlarni qayta ishlash
  • Data Detector Types — NSDataDetector orqali URL, telefon, manzil va sanalarni avtomatik aniqlash
  • Text Container — joylashuv uchun exclusionPaths, lineFragmentPadding va textContainerInset tizimi
  • Placeholder — o'rnatilgan emas, kulrang UILabel yoki attributedText orqali amalga oshiriladi
  • Dynamic height — avtomatik balandlik uchun contentSize kuzatuvi va cheklovlarni yangilash
  • UITextView UITextField dan ko'p qatorlilik, atributlar, aylantirish va data detectors qo'llab-quvvatlovi bilan farqlanadi

Biz kalit topshirig'i bilan mobil ilovani ishlab chiqamiz

IT Sectr 2017-yildan beri startaplar va korxonalar uchun iOS va Android ilovalarini yaratadi. Biz sizga maslahat beramiz va eng yaxshi yechimni taklif qilamiz.

Loyihani muhokama qilish

Shuningdek o'qing