Az UITextView egy többsoros szöveges UIKit komponens, amely az UIScrollView-ből örököl, és támogatja az attribútumos szöveg szerkesztését hivatkozások és képek beágyazásával. Az Apple Developer (2025) dokumentációja szerint az UITextView UITextViewDelegate-t biztosít textViewDidChange, shouldInteractWithURL és shouldInteractWithTextAttachment callback-ekkel az interakciók kezeléséhez. Az UITextField-től eltérően az UITextView támogatja a görgetést, a szöveges stílusokat a typingAttributes-en keresztül és a dataDetectorTypes-t a hivatkozások, címek és dátumok automatikus felismeréséhez. Ez az elsődleges komponens a tartalom megjelenítéséhez és többsoros szöveg beviteléhez iOS alkalmazásokban.
Főbb pontok
UITextView egy UIKit komponens, amely többsoros szöveg megjelenítésére és szerkesztésére szolgál. Az UILabel-től eltérően az UITextView támogatja a szöveg kijelölését, szerkesztését, görgetést méret túllépésekor és attribútumos szöveget. Az UIScrollView örököseként az UITextView automatikusan bekapcsolja a függőleges és vízszintes görgetést tartalom túllépésekor — ez az isScrollEnabled-en keresztül konfigurálható. Az osztály támogatja a szerkesztést az isEditable tulajdonságon keresztül: állítsa false-ra a csak olvasható módhoz. Az UITextView az NSLayoutManager-rel dolgozik a TextKit rendszeren keresztül: NSTextStorage (attribútumos szöveg tárolása) → NSLayoutManager (sorok elrendezése) → NSTextContainer (szövegterület geometriája). Ez az architektúra lehetővé teszi egyéni elrendezés létrehozását képek körülfolyatásával, többoszlopos szöveggel és összetett szöveges elrendezésekkel. Az UITextView cikkek, leírások, naplók, megjegyzések és bármilyen többsoros szöveg megjelenítésére használatos iOS-ben.
A különbség a UITextView és UITextField között messze túlmutat a sorok számán. Az UITextField egy egysoros UIControl placeholder, left/right view és törlés gomb támogatással. Az UITextView egy többsoros UIScrollView teljes TextKit rendszerrel attribútumos szöveghez. Az UITextField nem támogatja az NSAttributedString-et megjelenítési szinten (csak attributedText-en keresztül korlátozásokkal), az UITextView teljes mértékben feldolgozza az NSAttributedString-et különböző betűtípusokkal, bekezdésstílusokkal és beágyazott képekkel. Az UITextField beépített törlés gombbal rendelkezik (clearButtonMode), az UITextView nem — egyéni implementációt igényel. Az UITextView automatikusan méretezi magát a tartalomhoz (intrinsicContentSize), az UITextView kézi magasságkezelést igényel contentSize megfigyeléssel vagy Auto Layout korlátozásokkal. Az UITextView támogatja a dataDetectorTypes-t (hivatkozások automatikus felismerése), az UITextField iOS 16+-tól támogatja. Többsoros szöveg beviteléhez (megjegyzések, jegyzetek, üzenetek) válassza az UITextView-t. Űrlapmezőkhöz (név, email, jelszó) használja az UITextField-et.
| Lehetőség | UITextView | UITextField |
|---|---|---|
| Sorok | Többsoros | Egysoros |
| Placeholder | Nincs (egyéni) | Beépített |
| Szöveg attribútumok | Teljes NSAttributedString | Korlátozott |
| Data Detectors | Teljes támogatás | iOS 16+ |
| Képek inline | NSTextAttachment-en keresztül | Nem támogatott |
| Görgetés | Beépített (UIScrollView) | Nincs |
| Left/Right View | Nincs | Beépített |
NSAttributedString az UITextView egy alapvető képessége, amely megkülönbözteti az UITextField-től és UILabel-től. Az attribútumos karakterlánc lehetővé teszi különböző betűtípusok, színek, sorközök, igazítás és hivatkozások beállítását egy szövegen belül. Tulajdonságok: textView.attributedText = attributedString. Kulcs NSAttributedString.Key attribútumok: font (.systemFont, .boldSystemFont, egyéni UIFont), foregroundColor, backgroundColor, paragraphStyle (NSMutableParagraphStyle lineSpacing, alignment, lineBreakMode paraméterekkel), link (URL interaktív hivatkozásokhoz), underlineStyle, strikethroughStyle, shadow, baselineOffset, kern (betűköz). AttributedString létrehozásához használja a init(string:, attributes:) vagy NSMutableAttributedString-t attribútumok hozzáadásához különböző tartományokhoz. Az UITextView automatikusan interaktívként jeleníti meg a hivatkozásokat (link attribute) — megnyomáskor a shouldInteractWithURL delegált metódus hívódik meg. Az új bevitelhez tartozó attribútumok visszaállításához használja a typingAttributes-t.
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 egy protokoll, amely a szerkesztést és a szöveggel való interakciót kezeli. Fő metódusok: textViewDidBeginEditing(textView) — szerkesztés kezdetekor hívódik; textViewDidEndEditing — befejezésekor; textViewDidChange — minden szövegváltozáskor; textViewDidChangeSelection — kijelölés változásakor; textViewShouldInteractWithURL — hivatkozásra kattintáskor (Bool-t ad vissza, engedélyezett-e a navigáció); textViewShouldInteractWithTextAttachment — beágyazott képre kattintáskor. Az UITextView-n belüli hivatkozások kezeléséhez írja felül a shouldInteractWithURL-t — benne: megnyithatja az URL-t SFSafariViewController-ben, megjeleníthet UIAlertController-t megerősítéshez, kezelhet egyéni URL sémákat. Fontos: ha textView.isEditable = true, a hivatkozások dupla koppintásig nem kattinthatók — interaktív hivatkozásokhoz szerkesztés közben használjon gesture recognizer-eket.
SFSafariViewController a hivatkozások megnyitásának szabványos módja iOS alkalmazásokban. A shouldInteractWithURL metódusban hozzon létre egy SFSafariViewController-t az URL-lel, és jelenítse meg modálisan vagy navigationController-en keresztül. Univerzális hivatkozásokhoz használja a UIApplication.shared.open(url, options) függvényt — de ez kilép az alkalmazásból. A hivatkozások megnyitásának tiltásához adjon vissza false-t a shouldInteractWithURL-ben, és kezelje az URL-t saját maga.
NSTextContainer — a TextKit architektúra része, amely meghatározza azt a geometriai területet, ahol az UITextView szövege megjelenik. Minden UITextView rendelkezik egy alapértelmezett textContainer-rel, konfigurálható: textView.textContainerInset — a szöveg margói a textView határaitól (UIEdgeInsets); textView.textContainer.lineFragmentPadding — vízszintes margó minden soron belül; textView.textContainer.maximumNumberOfLines — a sorok számának korlátozása (0 = korlátlan); textView.textContainer.exclusionPaths — UIBezierPath tömb azon területekhez, amelyeket a szövegnek kerülnie kell (képek, egyéni alakzatok). Az exclusionPaths lehetővé teszi összetett elrendezés létrehozását: a szöveg körülfolyja a kerek profilképet, ikont vagy bármilyen tetszőleges kontúrt. Az UITextView dinamikus méretéhez figyelje a contentSize-t KVO-n vagy delegált segítségével, és frissítse a korlátozásokat.
// Dinamikus UITextView magasság contentSize segítségével
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 kép körülfolyatásához
let imageFrame = CGRect(x: 16, y: 100, width: 80, height: 80)
let exclusionPath = UIBezierPath(rect: imageFrame)
textView.textContainer.exclusionPaths = [exclusionPath]
dataDetectorTypes — az UITextView tulajdonsága, amely automatikusan felismer és interaktívvá tesz bizonyos adattípusokat a szövegben: .link (URL, email), .phoneNumber (telefonszámok), .address (címek), .calendarEvent (dátumok és események), .flightNumber (járatszámok), .lookupSuggestion (keresési javaslatok), .trackingNumber (követési számok), .money (összegek), .shipmentTrackingNumber, .all (minden típus). A Data Detector az NSDataDetector és URL segítségével működik, automatikusan kiemelve a felismert adatokat. A kezelés testreszabásához állítsa be a dataDetectorTypes-t és írja felül a shouldInteractWithURL-t a delegáltban. Fontos: a dataDetectorTypes csak URL és phoneNumber esetén működik további konfiguráció nélkül — a többi típus iOS 16+-t igényelhet. A Data Detector nem ütközik a link attribute-tel az NSAttributedString-ben — mindkét mechanizmus párhuzamosan működik. Csak olvasható UITextView esetén tartalommal (hírek, cikkek) állítsa be a dataDetectorTypes = [.link, .phoneNumber] értéket.
Vizsgáljunk meg két gyakorlati példát az UITextView használatára iOS alkalmazásokban. Az első — csak olvasható text view attribútumos szöveggel és data detector-rel tartalom megjelenítéséhez. A második — szerkeszthető text view lusta placeholder-rel és dinamikus magassággal megjegyzés űrlaphoz. Mindkét példa UIKit best practices-t használ: delegált protokoll, Auto Layout és TextKit.
Csak olvasható mód az isEditable = false és isSelectable = true beállításával aktiválódik. Ez lehetővé teszi a felhasználónak a szöveg kijelölését és a hivatkozásokra kattintást, de nem a szerkesztést. Állítsa be a dataDetectorTypes-t a hivatkozások automatikus felismeréséhez, backgroundColor = .clear az átlátszó háttérhez. Hosszú tartalom megjelenítéséhez használjon attributedText-t NSMutableParagraphStyle lineSpacing paraméterrel az olvashatóságért. Adjon hozzá link attributes-t a kulcs hivatkozásokhoz a szövegben.
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 }
// Tartalom betöltése URL-ről és attributedText beállítása
}
}
Placeholder az UITextView számára nem beépített — implementálja egy UILabel segítségével a textView felett vagy attributedText-en keresztül isEmpty ellenőrzéssel. Egyszerű megközelítés: egy szürke szövegű UILabel, amely elrejtőzik a szerkesztés megkezdésekor. A textViewDidChange-ben ellenőrizze a szöveg jelenlétét, és rejtse el/mutassa a placeholder-t. Elegánsabb megoldáshoz használja a typingAttributes tulajdonságot a beviteli szöveg színének beállításához. A textView dinamikus magassága contentSize megfigyeléssel és korlátozások frissítésével érhető el — ez a szabványos minta chat-ekhez és megjegyzés űrlapokhoz.
Gyakran Ismételt Kérdések
UITextView nem rendelkezik beépített placeholder-rel. Szabványos megoldás: adjon hozzá egy UILabel-t szürke szöveggel a textView fölé. A textViewDidBeginEditing-ben rejtse el a label-t, a textViewDidEndEditing-ben mutassa meg, ha a szöveg üres. Alternatívaként: használjon attributedText-t szürke színnel placeholder-ként, és állítsa vissza a szerkesztés megkezdésekor. Kész megoldáshoz használja a KMPlaceholderTextView vagy ReactorKit könyvtárat.
Állítsa be a textContainerInset = .zero és lineFragmentPadding = 0 értékeket: textView.textContainerInset = UIEdgeInsets.zero; textView.textContainer.lineFragmentPadding = 0. Továbbá: textView.contentInset = .zero. Ez teljesen eltávolítja a margókat a textView széleitől a szövegig. Vegye figyelembe, hogy a lineFragmentPadding alapértelmezés szerint 5.
Ellenőrizze: isSelectable = true (szükséges az interakcióhoz), a dataDetectorTypes tartalmazza a .link értéket, a delegált nem ad vissza false-t a shouldInteractWithURL-ben. Ha textView.isEditable = true, a hivatkozások egyszeri koppintással nem kattinthatók — dupla koppintás szükséges. Interaktív hivatkozásokhoz szerkeszthető textView-ben adjon hozzá UITapGestureRecognizer-t a textView fölé, és kezelje az URL-t kézzel.
Állítsa be az isScrollEnabled = true értéket, és adjon hozzá egy height constraint-et fix értékkel. A magasságot meghaladó szöveg görgethető lesz. Optimális UX-hez használjon maxHeight-t: figyelje a contentSize-t, és állítsa be a height constraint-et legfeljebb maxHeight értékre. A maxHeight túllépésekor kapcsolja be a scrollEnabled-et. Ez a szabványos minta üzenet- és megjegyzésbeviteli mezőkhöz.
Használja a NSTextAttachment-et: hozzon létre egy objektumot, állítsa be az image és bounds értékeket, majd hozzon létre egy NSAttributedString-t az attachment-ből, és illessze be a textView.attributedText-be. Példa: let attachment = NSTextAttachment(); attachment.image = image; attachment.bounds = CGRect(x, y, width, height); let attributedString = NSAttributedString(attachment: attachment). A kép inline jelenik meg a szövegben, és együtt görgethető vele.
Összefoglalás
Kulcsrakész mobilalkalmazást fejlesztünk
Az IT Sectr 2017 óta készít iOS és Android alkalmazásokat induló vállalkozásoknak és vállalkozásoknak. Tanácsot adunk, és a legjobb megoldást javasoljuk.
Olvassa el is