UITextView är en flerradig textkomponent i UIKit som ärver UIScrollView och stöder redigering av attribuerad text med inbäddning av länkar och bilder. Enligt Apple Developers dokumentation (2025) tillhandahåller UITextView UITextViewDelegate med callbacks textViewDidChange, shouldInteractWithURL och shouldInteractWithTextAttachment för hantering av interaktioner. Till skillnad från UITextField stöder UITextView rullning, textstilar via typingAttributes och dataDetectorTypes för automatisk detektering av länkar, adresser och datum. Detta är huvudkomponenten för att visa innehåll och mata in flerradig text i iOS-appar.
Huvudpunkter
UITextView är en UIKit-komponent avsedd för att visa och redigera flerradig text. Till skillnad från UILabel stöder UITextView textval, redigering, rullning vid överskridande av dimensioner och attribuerad text. Som arvtagare till UIScrollView aktiverar UITextView automatiskt vertikal och horisontell rullning vid överskridande av innehåll — detta konfigureras via isScrollEnabled. Klassen stöder redigering via egenskapen isEditable: sätt false för skrivskyddat läge. UITextView arbetar med NSLayoutManager genom TextKit-systemet: NSTextStorage (lagring av attribuerad text) → NSLayoutManager (radlayout) → NSTextContainer (geometri för textområdet). Denna arkitektur möjliggör skapandet av anpassad layout med text som flyter runt bilder, flerkolumnstext och komplexa textlayouter. UITextView används för att visa artiklar, beskrivningar, loggar, kommentarer och all flerradig text i iOS.
Skillnaden mellan UITextView och UITextField går långt bortom antalet rader. UITextField är en enradig UIControl med stöd för placeholder, left/right view och rensningsknapp. UITextView är en flerradig UIScrollView med ett fullfjädrat TextKit-system för attribuerad text. UITextField stöder inte NSAttributedString på visningsnivå (endast via attributedText med begränsningar), UITextView bearbetar NSAttributedString fullt ut med olika typsnitt, styckestilar och inbäddade bilder. UITextField har en inbyggd rensningsknapp (clearButtonMode), UITextView har inte — kräver anpassad implementering. UITextField ändrar automatiskt sin storlek efter innehåll (intrinsicContentSize), UITextView kräver manuell höjdhantering via contentSize-övervakning eller Auto Layout-begränsningar. UITextView stöder dataDetectorTypes (automatisk länkdetektering), UITextField stöder dem från iOS 16+. För inmatning av flerradig text (kommentarer, anteckningar, meddelanden) välj UITextView. För formulärfält (namn, e-post, lösenord) använd UITextField.
| Funktion | UITextView | UITextField |
|---|---|---|
| Rader | Flerradig | Enradig |
| Placeholder | Nej (anpassad) | Inbyggd |
| Textattribut | Full NSAttributedString | Begränsad |
| Data Detectors | Fullt stöd | iOS 16+ |
| Bilder inline | Via NSTextAttachment | Stöds inte |
| Rullning | Inbyggd (UIScrollView) | Nej |
| Left/Right View | Nej | Inbyggda |
NSAttributedString är en grundläggande funktion i UITextView som skiljer den från UITextField och UILabel. En attribuerad sträng gör det möjligt att ställa in olika typsnitt, färger, radavstånd, justering och länkar inom samma text. Egenskaper: textView.attributedText = attributedString. Viktiga NSAttributedString.Key-attribut: font (.systemFont, .boldSystemFont, anpassad UIFont), foregroundColor, backgroundColor, paragraphStyle (NSMutableParagraphStyle med lineSpacing, alignment, lineBreakMode), link (URL för interaktiva länkar), underlineStyle, strikethroughStyle, shadow, baselineOffset, kern (teckenavstånd). För att skapa attributedString använd init(string:, attributes:) eller NSMutableAttributedString för att lägga till attribut till olika intervall. UITextView visar automatiskt länkar (link attribute) som interaktiva — vid tryck anropas delegatmetoden shouldInteractWithURL. För att återställa attribut för ny inmatning använd typingAttributes.
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 är ett protokoll som hanterar redigering och interaktion med text. Huvudmetoder: textViewDidBeginEditing(textView) — anropas vid redigeringsstart; textViewDidEndEditing — vid avslut; textViewDidChange — vid varje textändring; textViewDidChangeSelection — vid ändring av markering; textViewShouldInteractWithURL — vid klick på en länk (returnerar Bool, om navigering är tillåten); textViewShouldInteractWithTextAttachment — vid klick på inbäddad bild. För att hantera länkar i UITextView åsidosätt shouldInteractWithURL — i den kan du: öppna URL i SFSafariViewController, visa UIAlertController för bekräftelse, hantera anpassade URL-scheman. Viktigt: om textView.isEditable = true blir länkar inte klickbara förrän dubbeltryck — för interaktiva länkar vid redigering använd gesture recognizers.
SFSafariViewController är standardsättet att öppna länkar i iOS-appar. I metoden shouldInteractWithURL skapa en SFSafariViewController med URL och presentera den modalt eller via navigationController. För universella länkar använd UIApplication.shared.open(url, options) — men detta lämnar appen. För att förhindra öppnande av länkar returnera false i shouldInteractWithURL och hantera URL själv.
NSTextContainer — en del av TextKit-arkitekturen som definierar det geometriska område där UITextView-texten visas. Varje UITextView har en standard textContainer, konfigurerbar via: textView.textContainerInset — textens marginaler från textViews gränser (UIEdgeInsets); textView.textContainer.lineFragmentPadding — horisontell marginal inom varje rad; textView.textContainer.maximumNumberOfLines — begränsning av antalet rader (0 = obegränsat); textView.textContainer.exclusionPaths — en array av UIBezierPath för områden som texten ska flöda runt (bilder, anpassade former). ExclusionPaths möjliggör komplex layout: text flyter runt en rund profilbild, ikon eller valfri kontur. För dynamisk storlek på UITextView övervaka contentSize via KVO eller delegat och uppdatera begränsningarna.
// Dynamisk UITextView-höjd via 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 för bildomslutning
let imageFrame = CGRect(x: 16, y: 100, width: 80, height: 80)
let exclusionPath = UIBezierPath(rect: imageFrame)
textView.textContainer.exclusionPaths = [exclusionPath]
dataDetectorTypes — egenskapen hos UITextView som automatiskt känner igen och gör interaktiva vissa datatyper i texten: .link (URL, e-post), .phoneNumber (telefonnummer), .address (adresser), .calendarEvent (datum och händelser), .flightNumber (flygnummer), .lookupSuggestion (sökförslag), .trackingNumber (spårningsnummer), .money (belopp), .shipmentTrackingNumber, .all (alla typer). Data Detector arbetar med NSDataDetector och URL och markerar automatiskt detekterad data. För anpassning av hantering ställ in dataDetectorTypes och åsidosätt shouldInteractWithURL i delegaten. Viktigt: dataDetectorTypes fungerar endast för URL och phoneNumber utan ytterligare konfiguration — övriga typer kan kräva iOS 16+. Data Detector är inte i konflikt med link attribute i NSAttributedString — båda mekanismerna fungerar parallellt. För skrivskyddad UITextView med innehåll (nyheter, artiklar) ställ in dataDetectorTypes = [.link, .phoneNumber].
Låt oss titta på två praktiska exempel på användning av UITextView i iOS-appar. Den första — skrivskyddad text view med attribuerad text och data detector för att visa innehåll. Den andra — redigerbar text view med lat placeholder och dynamisk höjd för kommentarsformulär. Båda exemplen använder best practices från UIKit: delegatprotokoll, Auto Layout och TextKit.
Skrivskyddat läge aktiveras genom att ställa in isEditable = false och isSelectable = true. Detta låter användaren välja text och klicka på länkar, men inte redigera. Ställ in dataDetectorTypes för automatisk länkdetektering, backgroundColor = .clear för transparent bakgrund. För att visa långt innehåll använd attributedText med NSMutableParagraphStyle lineSpacing för läsbarhet. Lägg till link attributes för viktiga länkar i texten.
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 }
// Ladda innehåll från URL och ställ in attributedText
}
}
Placeholder för UITextView är inte inbyggd — implementera den via en UILabel ovanför textView eller via attributedText med isEmpty-kontroll. Enkel metod: en UILabel med grå text som döljs vid redigeringsstart. I textViewDidChange kontrollera om text finns och dölj/visa placeholder. För en mer elegant lösning använd egenskapen typingAttributes för att ställa in färgen på inmatad text. Dynamisk höjd på textView uppnås genom contentSize-övervakning och uppdatering av begränsningar — detta är standardmönstret för chattar och kommentarsformulär.
Vanliga frågor
UITextView har ingen inbyggd placeholder. Standardlösning: lägg till en UILabel med grå text ovanför textView. I textViewDidBeginEditing dölj etiketten, i textViewDidEndEditing visa den om texten är tom. Alternativt: använd attributedText med grå färg som placeholder och återställ vid redigeringsstart. För en färdig lösning använd biblioteket KMPlaceholderTextView eller ReactorKit.
Ställ in textContainerInset = .zero och lineFragmentPadding = 0: textView.textContainerInset = UIEdgeInsets.zero; textView.textContainer.lineFragmentPadding = 0. Dessutom: textView.contentInset = .zero. Detta tar helt bort marginalerna från textViews kanter till texten. Observera att lineFragmentPadding som standard är 5.
Kontrollera: isSelectable = true (krävs för interaktion), dataDetectorTypes innehåller .link, delegaten returnerar inte false i shouldInteractWithURL. Om textView.isEditable = true är länkar inte klickbara med enkel tryckning — dubbeltryck krävs. För interaktiva länkar i redigerbar textView lägg till en UITapGestureRecognizer ovanför textView och hantera URL manuellt.
Ställ in isScrollEnabled = true och lägg till en height constraint med fast värde. Text som överskrider höjden rullas. För optimal UX använd maxHeight: övervaka contentSize och ställ in height constraint inte högre än maxHeight. Vid överskridande av maxHeight aktivera scrollEnabled. Detta är standardmönstret för inmatningsfält för meddelanden och kommentarer.
Använd NSTextAttachment: skapa ett objekt, ställ in image och bounds, skapa sedan en NSAttributedString från attachment och infoga i textView.attributedText. Exempel: let attachment = NSTextAttachment(); attachment.image = image; attachment.bounds = CGRect(x, y, width, height); let attributedString = NSAttributedString(attachment: attachment). Bilden visas inline i texten och rullas tillsammans med den.
Sammanfattning
Vi utvecklar en mobil applikation nyckelfärdigt
IT Sectr skapar iOS- och Android-applikationer för startups och företag sedan 2017. Vi ger dig råd och föreslår den bästa lösningen.
Läs också