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 — 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 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.
| Imkoniyat | UITextView | UITextField |
|---|---|---|
| Qatorlar | Ko'p qatorli | Bir qatorli |
| Placeholder | Yo'q (maxsus) | O'rnatilgan |
| Matn atributlari | To'liq NSAttributedString | Cheklangan |
| Data Detectors | To'liq qo'llab-quvvatlash | iOS 16+ |
| Inline rasmlar | NSTextAttachment orqali | Qo'llab-quvvatlanmaydi |
| Aylantirish | O'rnatilgan (UIScrollView) | Yo'q |
| Left/Right View | Yo'q | O'rnatilgan |
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.
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 — 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 — 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.
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.
// 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]
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.
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.
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.
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 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 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.
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.
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.
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.
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
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.
Shuningdek o'qing