UITextView: ce este, introducere multi-linie și principiu de funcționare

Autor: IT Sectr Publicat: 2026-07-07 Timp de citire: 8 min

UITextView este o componentă text multi-linie UIKit, care moștenește UIScrollView și suportă editarea textului atribuit cu încorporarea linkurilor și imaginilor. Conform documentației Apple Developer (2025), UITextView oferă UITextViewDelegate cu callback-uri textViewDidChange, shouldInteractWithURL și shouldInteractWithTextAttachment pentru gestionarea interacțiunilor. Spre deosebire de UITextField, UITextView suportă derularea, stilurile text prin typingAttributes și dataDetectorTypes pentru detectarea automată a linkurilor, adreselor și datelor. Aceasta este componenta principală pentru afișarea conținutului și introducerea textului multi-linie în aplicațiile iOS.

Principalele

  • UITextView — câmp text multi-linie UIKit, moștenitor al UIScrollView cu suport pentru editare
  • NSAttributedString — suport pentru text atribuit: fonturi, culori, spațieri între linii, linkuri
  • UITextViewDelegate — gestionare prin textViewDidChange, shouldInteractWithURL, didBeginEditing
  • Data Detector Types — detectare automată a linkurilor, adreselor, datelor, numerelor de telefon în text
  • Text Container — sistemul textContainer, exclusionPaths și lineFragmentPadding pentru aspect personalizat

Ce este UITextView

UITextView este o componentă UIKit destinată afișării și editării textului multi-linie. Spre deosebire de UILabel, UITextView suportă selectarea textului, editarea, derularea la depășirea dimensiunilor și textul atribuit. Fiind moștenitor al UIScrollView, UITextView activează automat derularea verticală și orizontală la depășirea conținutului — aceasta se configurează prin isScrollEnabled. Clasa suportă editarea prin proprietatea isEditable: setați false pentru modul doar citire. UITextView lucrează cu NSLayoutManager prin sistemul TextKit: NSTextStorage (stocarea textului atribuit) → NSLayoutManager (aranjarea rândurilor) → NSTextContainer (geometria zonei de text). Această arhitectură permite crearea de aspect personalizat cu înfășurarea textului în jurul imaginilor, text multi-coloană și machete text complexe. UITextView este utilizat pentru afișarea articolelor, descrierilor, logurilor, comentariilor și oricărui text multi-linie în iOS.

UITextView vs UITextField: diferențe cheie

Diferența dintre UITextView și UITextField depășește cu mult numărul de rânduri. UITextField este un UIControl pe un singur rând cu suport pentru placeholder, left/right view și buton de ștergere. UITextView este un UIScrollView multi-linie cu sistem TextKit complet pentru text atribuit. UITextField nu suportă NSAttributedString la nivel de afișare (doar prin attributedText cu limitări), UITextView procesează NSAttributedString complet cu fonturi diferite, stiluri de paragraf și imagini încorporate. UITextField are buton de ștergere încorporat (clearButtonMode), UITextView nu are — necesită implementare personalizată. UITextView își schimbă automat dimensiunea după conținut (intrinsicContentSize), UITextView necesită gestionare manuală a înălțimii prin observarea contentSize sau constrângeri Auto Layout. UITextView suportă dataDetectorTypes (detectare automată a linkurilor), UITextField le suportă din iOS 16+. Pentru introducerea textului multi-linie (comentarii, note, mesaje) alegeți UITextView. Pentru câmpuri de formular (nume, email, parolă) utilizați UITextField.

CapacitateUITextViewUITextField
RânduriMulti-linieUn singur rând
PlaceholderNu (personalizat)Încorporat
Atribute textNSAttributedString completLimitat
Data DetectorsSuport completiOS 16+
Imagini inlinePrin NSTextAttachmentNu se suportă
DerulareÎncorporată (UIScrollView)Nu
Left/Right ViewNuÎncorporate

NSAttributedString și formatarea textului

NSAttributedString este o capacitate fundamentală a UITextView, care îl diferențiază de UITextField și UILabel. Șirul atribuit permite setarea diferitelor fonturi, culori, spațieri între rânduri, aliniere și linkuri în cadrul aceluiași text. Proprietăți: textView.attributedText = attributedString. Atribute cheie NSAttributedString.Key: font (.systemFont, .boldSystemFont, UIFont personalizat), foregroundColor, backgroundColor, paragraphStyle (NSMutableParagraphStyle cu lineSpacing, alignment, lineBreakMode), link (URL pentru linkuri interactive), underlineStyle, strikethroughStyle, shadow, baselineOffset, kern (spațiere între caractere). Pentru a crea attributedString utilizați init(string:, attributes:) sau NSMutableAttributedString pentru adăugarea atributelor la diferite intervale. UITextView afișează automat linkurile (link attribute) ca interactive — la apăsare se apelează metoda delegată shouldInteractWithURL. Pentru resetarea atributelor pentru introducere nouă utilizați 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

Delegatul UITextViewDelegate și gestionarea linkurilor

UITextViewDelegate este un protocol care gestionează editarea și interacțiunea cu textul. Metode principale: textViewDidBeginEditing(textView) — se apelează la începerea editării; textViewDidEndEditing — la finalizare; textViewDidChange — la fiecare modificare a textului; textViewDidChangeSelection — la modificarea selecției; textViewShouldInteractWithURL — la apăsarea unui link (returnează Bool, dacă navigarea este permisă); textViewShouldInteractWithTextAttachment — la apăsarea unei imagini încorporate. Pentru gestionarea linkurilor în interiorul UITextView suprascrieți shouldInteractWithURL — în el puteți: deschide URL în SFSafariViewController, afișa UIAlertController pentru confirmare, gestiona scheme URL personalizate. Important: dacă textView.isEditable = true, linkurile devin indisponibile pentru apăsare până la dublu tap — pentru linkuri interactive la editare utilizați gesture recognizers.

Gestionarea linkurilor prin SFSafariViewController

SFSafariViewController — metoda standard de deschidere a linkurilor în aplicațiile iOS. În metoda shouldInteractWithURL creați un SFSafariViewController cu URL și prezentați-l modal sau prin navigationController. Pentru linkuri universale utilizați UIApplication.shared.open(url, options) — dar aceasta iese din aplicație. Pentru a interzice deschiderea linkurilor returnați false în shouldInteractWithURL și gestionați URL-ul manual.

Sistemul Text Container: margini și exclusionPaths

NSTextContainer — parte a arhitecturii TextKit, care definește zona geometrică în care este afișat textul UITextView. Fiecare UITextView are un textContainer standard, configurabil prin: textView.textContainerInset — marginile textului față de granițele textView (UIEdgeInsets); textView.textContainer.lineFragmentPadding — marginea orizontală în interiorul fiecărui rând; textView.textContainer.maximumNumberOfLines — limitarea numărului de rânduri (0 = fără limită); textView.textContainer.exclusionPaths — un array de UIBezierPath pentru zonele pe care textul trebuie să le ocolească (imagini, forme personalizate). ExclusionPaths permit crearea de aspect complex: textul înconjoară o imagine rotundă de profil, o pictogramă sau orice contur arbitrar. Pentru dimensiunea dinamică a UITextView observați contentSize prin KVO sau delegat și actualizați constrângerile.

swift
// Înălțime dinamică UITextView prin 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 pentru înfășurarea imaginilor
let imageFrame = CGRect(x: 16, y: 100, width: 80, height: 80)
let exclusionPath = UIBezierPath(rect: imageFrame)
textView.textContainer.exclusionPaths = [exclusionPath]

Data Detector Types: detectarea automată a datelor

dataDetectorTypes — proprietatea UITextView care recunoaște automat și face interactive anumite tipuri de date în text: .link (URL, email), .phoneNumber (numere de telefon), .address (adrese), .calendarEvent (date și evenimente), .flightNumber (numere de zbor), .lookupSuggestion (sugestii de căutare), .trackingNumber (numere de urmărire), .money (sume), .shipmentTrackingNumber, .all (toate tipurile). Data Detector lucrează cu NSDataDetector și URL, evidențiind automat datele detectate. Pentru personalizarea gestionării setați dataDetectorTypes și suprascrieți shouldInteractWithURL în delegat. Important: dataDetectorTypes funcționează doar pentru URL și phoneNumber fără configurare suplimentară — celelalte tipuri pot necesita iOS 16+. Data Detector nu intră în conflict cu link attribute în NSAttributedString — ambele mecanisme funcționează paralel. Pentru UITextView doar citire cu conținut (știri, articole) setați dataDetectorTypes = [.link, .phoneNumber].

  • .link — URL, adrese email; se afișează ca linkuri albastre
  • .phoneNumber — numere de telefon; apăsarea arată acțiunea Call
  • .address — adrese poștale; apăsarea deschide Maps
  • .calendarEvent — date și ore; apăsarea creează un eveniment în calendar
  • .flightNumber — numere de zbor (iOS 16+); verificare rapidă a zborului

Exemple de cod cu UITextView

Să examinăm două exemple practice de utilizare a UITextView în aplicațiile iOS. Primul — text view doar citire cu text atribuit și data detector pentru afișarea conținutului. Al doilea — text view editabil cu placeholder leneș și înălțime dinamică pentru formularul de comentarii. Ambele exemple utilizează best practices UIKit: protocolul delegat, Auto Layout și TextKit.

UITextView doar citire cu conținut și linkuri

Modul doar citire se activează prin setarea isEditable = false și isSelectable = true. Aceasta permite utilizatorului să selecteze textul și să apese pe linkuri, dar nu să editeze. Setați dataDetectorTypes pentru detectarea automată a linkurilor, backgroundColor = .clear pentru fundal transparent. Pentru afișarea conținutului lung utilizați attributedText cu NSMutableParagraphStyle lineSpacing pentru lizibilitate. Adăugați link attributes pentru linkurile cheie din text.

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 }
        // Încarcă conținutul din URL și setează attributedText
    }
}

UITextView editabil cu placeholder

Placeholder pentru UITextView nu este încorporat — implementați-l printr-un UILabel deasupra textView sau prin attributedText cu verificarea isEmpty. Abordare simplă: un UILabel cu text gri care se ascunde la începerea editării. În textViewDidChange verificați prezența textului și ascundeți/afișați placeholder-ul. Pentru o soluție mai elegantă utilizați proprietatea typingAttributes pentru a seta culoarea textului introdus. Înălțimea dinamică a textView se obține prin observarea contentSize și actualizarea constrângerilor — acesta este modelul standard pentru chat-uri și formulare de comentarii.

Întrebări frecvente

Cum adaug placeholder în UITextView?

UITextView nu are placeholder încorporat. Soluția standard: adăugați un UILabel cu text gri deasupra textView. În textViewDidBeginEditing ascundeți label-ul, în textViewDidEndEditing afișați-l dacă textul este gol. Alternativ: utilizați attributedText cu culoare gri ca placeholder și resetați-l la începerea editării. Pentru o soluție gata făcută utilizați biblioteca KMPlaceholderTextView sau ReactorKit.

Cum elimin marginile în UITextView?

Setați textContainerInset = .zero și lineFragmentPadding = 0: textView.textContainerInset = UIEdgeInsets.zero; textView.textContainer.lineFragmentPadding = 0. Suplimentar: textView.contentInset = .zero. Aceasta va elimina complet marginile de la marginile textView până la text. Rețineți că lineFragmentPadding implicit este 5.

De ce UITextView nu deschide linkurile?

Verificați: isSelectable = true (necesar pentru interacțiune), dataDetectorTypes include .link, delegatul nu returnează false în shouldInteractWithURL. Dacă textView.isEditable = true, linkurile sunt indisponibile pentru o singură apăsare — este necesar dublu tap. Pentru linkuri interactive în textView editabil adăugați un UITapGestureRecognizer deasupra textView și gestionați URL-ul manual.

Cum fac UITextView cu înălțime fixă și derulare?

Setați isScrollEnabled = true și adăugați o constrângere de înălțime cu valoare fixă. Textul care depășește înălțimea va fi derulat. Pentru UX optim utilizați maxHeight: observați contentSize și setați constrângerea de înălțime nu mai mare de maxHeight. La depășirea maxHeight activați scrollEnabled. Acesta este modelul standard pentru câmpurile de introducere a mesajelor și comentariilor.

Cum inserez o imagine în UITextView?

Utilizați NSTextAttachment: creați un obiect, setați image și bounds, apoi creați un NSAttributedString din attachment și inserați-l în textView.attributedText. Exemplu: let attachment = NSTextAttachment(); attachment.image = image; attachment.bounds = CGRect(x, y, width, height); let attributedString = NSAttributedString(attachment: attachment). Imaginea se va afișa inline în text și se va derula împreună cu acesta.

Rezumat

  • UITextView — componentă text multi-linie UIKit, moștenitor al UIScrollView cu suport TextKit
  • NSAttributedString — capacitate cheie pentru formatarea fonturilor, culorilor, linkurilor și paragrafelor
  • UITextViewDelegate — gestionarea editării și procesarea apăsărilor pe linkuri și atașamente
  • Data Detector Types — detectare automată a URL, telefoanelor, adreselor și datelor prin NSDataDetector
  • Text Container — sistem cu exclusionPaths, lineFragmentPadding și textContainerInset pentru aspect
  • Placeholder — nu este încorporat, se implementează prin UILabel sau attributedText cu culoare gri
  • Dynamic height — observarea contentSize și actualizarea constrângerilor pentru înălțime automată
  • UITextView se deosebește de UITextField prin suportul pentru multi-linie, atribute, derulare și data detectors

Vom dezvolta o aplicație mobilă la cheie

IT Sectr creează aplicații iOS și Android pentru startup-uri și afaceri din 2017. Vă vom consilia și vă vom propune cea mai bună soluție.

Discutați proiectul

Citiți și