UITextView — bu, UIKit-in çoxsətirli mətn komponentidir, UIScrollView-dən miras alır və linklər və şəkillər əlavə edilmiş atributlaşdırılmış mətnin redaktəsini dəstəkləyir. Apple Developer (2025) sənədlərinə görə, UITextView textViewDidChange, shouldInteractWithURL və shouldInteractWithTextAttachment geri çağırışları ilə UITextViewDelegate təmin edir. UITextField-dən fərqli olaraq, UITextView sürüşdürməni, typingAttributes vasitəsilə mətn üslublarını və linklərin, ünvanların və tarixlərin avtomatik müəyyən edilməsi üçün dataDetectorTypes-i dəstəkləyir. Bu, iOS tətbiqlərində məzmunun göstərilməsi və çoxsətirli mətn daxil edilməsi üçün əsas komponentdir.
Əsas məqamlar
UITextView — çoxsətirli mətnin göstərilməsi və redaktəsi üçün nəzərdə tutulmuş UIKit komponentidir. UILabel-dən fərqli olaraq, UITextView mətn seçilməsini, redaktəni, ölçüləri aşdıqda sürüşdürməni və atributlaşdırılmış mətni dəstəkləyir. UIScrollView-in varisi olaraq, UITextView məzmun aşdıqda avtomatik olaraq şaquli və üfüqi sürüşdürməni aktivləşdirir — bu, isScrollEnabled vasitəsilə konfiqurasiya olunur. Sinif redaktəni isEditable xüsusiyyəti vasitəsilə dəstəkləyir: yalnız oxuma rejimi üçün false qoyun. UITextView TextKit sistemi vasitəsilə NSLayoutManager ilə işləyir: NSTextStorage (atributlaşdırılmış mətnin saxlanması) → NSLayoutManager (sətirlərin düzülüşü) → NSTextContainer (mətn sahəsinin həndəsəsi). Bu memarlıq şəkillərin ətrafına axma, çoxsütunlu mətn və mürəkkəb mətn layoutları yaratmağa imkan verir. UITextView iOS-da məqalələrin, təsvirlərin, logların, şərhlərin və istənilən çoxsətirli mətnin göstərilməsi üçün istifadə olunur.
UITextView və UITextField arasındakı fərq sətir sayından çox daha genişdir. UITextField — placeholder, left/right view və təmizləmə düyməsi dəstəyi ilə təksətirli UIControl-dur. UITextView — atributlaşdırılmış mətn üçün tam TextKit sistemi ilə çoxsətirli UIScrollView-dir. UITextField NSAttributedString-i göstərmə səviyyəsində dəstəkləmir (yalnız məhdudiyyətlə attributedText vasitəsilə), UITextView NSAttributedString-i müxtəlif şriftlər, paraqraf üslubları və daxil edilmiş şəkillərlə tam işləyir. UITextField-in daxili təmizləmə düyməsi var (clearButtonMode), UITextView-də yoxdur — fərdi tətbiq tələb olunur. UITextField avtomatik olaraq məzmuna uyğun ölçüsünü dəyişir (intrinsicContentSize), UITextView əllə hündürlüyünü contentSize müşahidəsi və ya Auto Layout məhdudiyyətləri vasitəsilə idarə etməyi tələb edir. UITextView dataDetectorTypes-i dəstəkləyir (linklərin avtomatik müəyyən edilməsi), UITextField onu iOS 16+-dan dəstəkləyir. Çoxsətirli mətn daxil etmək üçün (şərhlər, qeydlər, mesajlar) UITextView seçin. Forma sahələri üçün (ad, email, şifrə) UITextField istifadə edin.
| Xüsusiyyət | UITextView | UITextField |
|---|---|---|
| Sətirlər | Çoxsətirli | Təksətirli |
| Placeholder | Yox (fərdi) | Daxili |
| Mətn atributları | Tam NSAttributedString | Məhdud |
| Data Detectors | Tam dəstək | iOS 16+ |
| Inline şəkillər | NSTextAttachment vasitəsilə | Dəstəklənmir |
| Sürüşdürmə | Daxili (UIScrollView) | Yox |
| Left/Right View | Yox | Daxili |
NSAttributedString — UITextView-in UITextField və UILabel-dən fərqləndirən əsas xüsusiyyətidir. Atributlaşdırılmış sətr eyni mətn daxilində müxtəlif şriftlər, rənglər, sətirarası boşluqlar, düzləşdirmə və linklər qurmağa imkan verir. Xüsusiyyətlər: textView.attributedText = attributedString. Əsas NSAttributedString.Key atributları: font (.systemFont, .boldSystemFont, fərdi UIFont), foregroundColor, backgroundColor, paragraphStyle (lineSpacing, alignment, lineBreakMode ilə NSMutableParagraphStyle), link (interaktiv linklər üçün URL), underlineStyle, strikethroughStyle, shadow, baselineOffset, kern (hərflərarası boşluq). attributedString yaratmaq üçün init(string:, attributes:) və ya müxtəlif diapazonlara atributlar əlavə etmək üçün NSMutableAttributedString istifadə edin. UITextView linkləri (link attribute) avtomatik olaraq interaktiv göstərir — basıldıqda shouldInteractWithURL delegat metodu çağırılır. Yeni daxiletmə üçün atributları sıfırlamaq üçün typingAttributes istifadə edin.
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 — redaktə və mətnlə qarşılıqlı əlaqəni idarə edən protokoldur. Əsas metodlar: textViewDidBeginEditing(textView) — redaktə başladıqda çağırılır; textViewDidEndEditing — bitirdikdə; textViewDidChange — hər mətn dəyişikliyində; textViewDidChangeSelection — seçim dəyişdikdə; textViewShouldInteractWithURL — linkə basıldıqda (Bool qaytarır, keçidə icazə verilibmi); textViewShouldInteractWithTextAttachment — daxil edilmiş şəkilə basıldıqda. UITextView daxilindəki linkləri işləmək üçün shouldInteractWithURL-i yenidən təyin edin — burada: URL-i SFSafariViewController-da açmaq, təsdiq üçün UIAlertController göstərmək, fərdi URL sxemlərini işləmək olar. Vacib: əgər textView.isEditable = true olarsa, linklər iki dəfə toxunana qədər kliklənməz olur — redaktə zamanı interaktiv linklər üçün gesture recognizers istifadə edin.
SFSafariViewController — iOS tətbiqlərində linkləri açmağın standart üsuludur. shouldInteractWithURL metodunda URL ilə SFSafariViewController yaradın və onu modal və ya navigationController vasitəsilə təqdim edin. Universal linklər üçün UIApplication.shared.open(url, options) istifadə edin — lakin bu tətbiqdən kənara çıxır. Linklərin açılmasını qadağan etmək üçün shouldInteractWithURL-də false qaytarın və URL-i özünüz işləyin.
NSTextContainer — TextKit memarlığının bir hissəsi, UITextView mətninin göstərildiyi həndəsi sahəni müəyyən edir. Hər UITextView-in standart textContainer-i var, konfiqurasiya olunur: textView.textContainerInset — mətnin textView sərhədlərindən boşluğu (UIEdgeInsets); textView.textContainer.lineFragmentPadding — hər sətir daxilində üfüqi boşluq; textView.textContainer.maximumNumberOfLines — sətir sayı məhdudiyyəti (0 = limitsiz); textView.textContainer.exclusionPaths — mətnin ətrafından axması lazım olan sahələr üçün UIBezierPath massivi (şəkillər, fərdi formalar). ExclusionPaths mürəkkəb layout yaratmağa imkan verir: mətn dairəvi profil şəkli, ikona və ya istənilən kontur ətrafından axır. UITextView-in dinamik ölçüsü üçün contentSize-i KVO və ya delegat vasitəsilə izləyin və məhdudiyyətləri yeniləyin.
// contentSize vasitəsilə dinamik UITextView hündürlüyü
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()
}
}
// Şəkillərin ötürülməsi üçün ExclusionPath
let imageFrame = CGRect(x: 16, y: 100, width: 80, height: 80)
let exclusionPath = UIBezierPath(rect: imageFrame)
textView.textContainer.exclusionPaths = [exclusionPath]
dataDetectorTypes — UITextView-in xüsusiyyəti, mɗndə müəyyən məlumat növlərini avtomatik tanıyır və interaktiv edir: .link (URL, email), .phoneNumber (telefon nömrələri), .address (ünvanlar), .calendarEvent (tarixlər və hadisələr), .flightNumber (uçuş nömrələri), .lookupSuggestion (axtarış təklifləri), .trackingNumber (izləmə nömrələri), .money (məbləğlər), .shipmentTrackingNumber, .all (bütün növlər). Data Detector NSDataDetector və URL ilə işləyir, aşkarlanmış məlumatları avtomatik vurğulayır. İşlənməni fərdiləşdirmək üçün dataDetectorTypes qurun və delegatda shouldInteractWithURL-i yenidən təyin edin. Vacib: dataDetectorTypes əlavə konfiqurasiya olmadan yalnız URL və phoneNumber üçün işləyir — qalan növlər iOS 16+ tələb edə bilər. Data Detector NSAttributedString-dəki link attribute ilə ziddiyyət təşkil etmir — hər iki mexanizm paralel işləyir. Məzmunlu (xəbərlər, məqalələr) yalnız oxuma UITextView üçün dataDetectorTypes = [.link, .phoneNumber] qurun.
iOS tətbiqlərində UITextView istifadəsinin iki praktik nümunəsini nəzərdən keçirək. Birinci — məzmunu göstərmək üçün atributlaşdırılmış mətn və data detector ilə yalnız oxuma text view. İkinci — şərh forması üçün tənbel placeholder və dinamik hündürlüklə redaktə olunan text view. Hər iki nümunə best practices UIKit-dən istifadə edir: delegat protokolu, Auto Layout və TextKit.
Yalnız oxuma rejimi isEditable = false və isSelectable = true qurmaqla aktivləşdirilir. Bu, istifadəçiyə mətni seçməyə və linklərə basmağa imkan verir, lakin redaktə etməz. Linklərin avtomatik müəyyən edilməsi üçün dataDetectorTypes, şəffaf fon üçün backgroundColor = .clear qurun. Uzun məzmunu göstərmək üçün oxunaqlılıq üçün NSMutableParagraphStyle lineSpacing ilə attributedText istifadə edin. Mətndəki əsas linklər üçün link attributes əlavə edin.
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-dən məzmunu yüklə və attributedText qur
}
}
Placeholder UITextView üçün daxili deyil — onu textView üzərində UILabel və ya isEmpty yoxlanışı ilə attributedText vasitəsilə tətbiq edin. Sadə yanaşma: redaktə başladıqda gizlənən boz mɗtnli UILabel. textViewDidChange-də mɗtnin varlığını yoxlayın və placeholder-i gizlədin/göstərin. Daha zərif həll üçün daxil edilən mɗtnin rəngini qurmaq üçün typingAttributes xüsusiyyətindən istifadə edin. textView-in dinamik hündürlüyü contentSize müşahidəsi və məhdudiyyətlərin yenilənməsi ilə əldə edilir — bu, söhbətlər və şərh formaları üçün standart nümunədir.
Tez-tez verilən suallar
UITextView-in daxili placeholder-i yoxdur. Standart həll: textView-in üzərində boz mɗtnli UILabel əlavə edin. textViewDidBeginEditing-də label-i gizlədin, textViewDidEndEditing-də mɗtn boşdursa göstərin. Alternativ: placeholder kimi boz rəngli attributedText istifadə edin və redaktə başladıqda sıfırlayın. Hazır həll üçün KMPlaceholderTextView və ya ReactorKit kitabxanasından istifadə edin.
textContainerInset = .zero və lineFragmentPadding = 0 qurun: textView.textContainerInset = UIEdgeInsets.zero; textView.textContainer.lineFragmentPadding = 0. Əlavə: textView.contentInset = .zero. Bu, textView-in kənarlarından mɗtnə qədər bütün boşluqları tamamilə təmizləyəcək. Qeyd: lineFragmentPadding standart olaraq 5-dir.
Yoxlayın: isSelectable = true (qarşılıqlı əlaqə üçün zəruridir), dataDetectorTypes .link daxil edir, delegat shouldInteractWithURL-də false qaytarmır. Əgər textView.isEditable = true olarsa, linklər tək kliklə əlçatmaz olur — iki dəfə toxunma tələb olunur. Redaktə olunan textView-də interaktiv linklər üçün textView-in üzərində UITapGestureRecognizer əlavə edin və URL-i əllə işləyin.
isScrollEnabled = true qurun və sabit dəyərlə height constraint əlavə edin. Hündürlüyü aşan mɗtn sürüşdürüləcək. Optimal UX üçün maxHeight istifadə edin: contentSize-i izləyin və height constraint-i maxHeight-dən yuxarı qurmayın. maxHeight aşıldıqda scrollEnabled-i aktivləşdirin. Bu, mesaj və şərh daxiletmə sahələri üçün standart nümunədir.
NSTextAttachment istifadə edin: obyekt yaradın, image və bounds qurun, sonra attachment-dən NSAttributedString yaradın və textView.attributedText-dən daxil edin. Nümunə: let attachment = NSTextAttachment(); attachment.image = image; attachment.bounds = CGRect(x, y, width, height); let attributedString = NSAttributedString(attachment: attachment). Şəkil mɗtn daxilində inline göstəriləcək və onunla birlikdə sürüşdürüləcək.
Nəticələr
Açar təslim mobil tətbiq hazırlayacağıq
IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.
Həm də oxuyun