UITextView: bu nədir, çoxsətirli daxil etmə və iş prinsipi

Müəllif: IT Sectr Dərc olunub: 2026-07-07 Oxuma vaxtı: 8 dəq

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 — redaktə dəstəyi ilə UIScrollView-in varisi olan UIKit-in çoxsətirli mətn sahəsi
  • NSAttributedString — atributlaşdırılmış mətn dəstəyi: şriftlər, rənglər, sətirarası boşluqlar, linklər
  • UITextViewDelegate — textViewDidChange, shouldInteractWithURL, didBeginEditing vasitəsilə idarəetmə
  • Data Detector Types — mətndə linklərin, ünvanların, tarixlərin, telefon nömrələrinin avtomatik müəyyən edilməsi
  • Text Container — fərdi düzülüş üçün textContainer, exclusionPaths və lineFragmentPadding sistemi

UITextView nədir

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 vs UITextField: əsas fərqlər

UITextViewUITextField 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ətUITextViewUITextField
SətirlərÇoxsətirliTəksətirli
PlaceholderYox (fərdi)Daxili
Mətn atributlarıTam NSAttributedStringMəhdud
Data DetectorsTam dəstəkiOS 16+
Inline şəkillərNSTextAttachment vasitəsiləDəstəklənmir
SürüşdürməDaxili (UIScrollView)Yox
Left/Right ViewYoxDaxili

NSAttributedString və mətn formatlaşdırma

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.

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 və linklərin işlənməsi

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 vasitəsilə linklərin işlənməsi

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.

Text Container sistemi: boşluqlar və exclusionPaths

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.

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

Data Detector Types: məlumatların avtomatik müəyyən edilməsi

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.

  • .link — URL, email ünvanları; mavi linklər kimi göstərilir
  • .phoneNumber — telefon nömrələri; basıldıqda Call əməliyyatı göstərilir
  • .address — poçt ünvanları; basıldıqda Maps açılır
  • .calendarEvent — tarixlər və vaxt; basıldıqda təqvim hadisəsi yaradılır
  • .flightNumber — uçuş nömrələri (iOS 16+); uçuşun sürətli yoxlanması

UITextView ilə kod nümunələri

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.

Məzmun və linklərlə yalnız oxuma UITextView

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.

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-dən məzmunu yüklə və attributedText qur
    }
}

Placeholder ilə redaktə olunan UITextView

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-də placeholder necə əlavə etmək olar?

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.

UITextView-də boşluqları necə təmizləmək olar?

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.

Niyə UITextView linkləri açmır?

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.

Sürüşdürmə ilə sabit hündürlükdə UITextView necə etmək olar?

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.

UITextView-də şəkil necə əlavə etmək olar?

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

  • UITextView — TextKit dəstəyi ilə UIScrollView-in varisi olan çoxsɗtirli UIKit mɗtn komponenti
  • NSAttributedString — şriftlərin, rənglərin, linklərin və paraqrafların formatlanması üçün əsas imkan
  • UITextViewDelegate — redaktə idarəsi və linklərə və əlavələrə kliklərin işlənməsi
  • Data Detector Types — NSDataDetector vasitəsilə URL, telefon, ünvan və tarixlərin avtomatik müəyyən edilməsi
  • Text Container — düzülüş üçün exclusionPaths, lineFragmentPadding və textContainerInset sistemi
  • Placeholder — daxili deyil, boz rəngli UILabel və ya attributedText vasitəsilə tətbiq olunur
  • Dynamic height — avtomatik hündürlük üçün contentSize müşahidəsi və məhdudiyyətlərin yenilənməsi
  • UITextView UITextField-dən çoxsɗtirlilik, atributlar, sürüşdürmə və data detectors dəstəyi ilə fərqlənir

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.

Layihəni müzakirə et

Həm də oxuyun