UITextView: vad är det, flerradig inmatning och funktionsprincip

Författare: IT Sectr Publicerad: 2026-07-07 Lästid: 8 min

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 — flerradigt textfält UIKit, arvtagare till UIScrollView med redigeringsstöd
  • NSAttributedString — stöd för attribuerad text: typsnitt, färger, radavstånd, länkar
  • UITextViewDelegate — hantering via textViewDidChange, shouldInteractWithURL, didBeginEditing
  • Data Detector Types — automatisk detektering av länkar, adresser, datum, telefonnummer i text
  • Text Container — system med textContainer, exclusionPaths och lineFragmentPadding för anpassad layout

Vad är UITextView

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.

UITextView vs UITextField: viktiga skillnader

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.

FunktionUITextViewUITextField
RaderFlerradigEnradig
PlaceholderNej (anpassad)Inbyggd
TextattributFull NSAttributedStringBegränsad
Data DetectorsFullt stödiOS 16+
Bilder inlineVia NSTextAttachmentStöds inte
RullningInbyggd (UIScrollView)Nej
Left/Right ViewNejInbyggda

NSAttributedString och textformatering

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.

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

Delegaten UITextViewDelegate och länkhantering

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.

Länkhantering via SFSafariViewController

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.

Text Container-systemet: marginaler och exclusionPaths

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.

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

Data Detector Types: automatisk datadetektering

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].

  • .link — URL, e-postadresser; visas som blå länkar
  • .phoneNumber — telefonnummer; tryck visar Call-åtgärd
  • .address — postadresser; tryck öppnar Kartor
  • .calendarEvent — datum och tid; tryck skapar en kalenderhändelse
  • .flightNumber — flygnummer (iOS 16+); snabb flygkontroll

Kodexempel med UITextView

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.

Skrivskyddad UITextView med innehåll och länkar

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.

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 }
        // Ladda innehåll från URL och ställ in attributedText
    }
}

Redigerbar UITextView med placeholder

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

Hur lägger jag till en placeholder i UITextView?

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.

Hur tar jag bort marginaler i UITextView?

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.

Varför öppnar inte UITextView länkar?

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.

Hur gör jag en UITextView med fast höjd och rullning?

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.

Hur infogar jag en bild i UITextView?

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

  • UITextView — flerradig textkomponent UIKit, arvtagare till UIScrollView med TextKit-stöd
  • NSAttributedString — nyckelfunktion för formatering av typsnitt, färger, länkar och stycken
  • UITextViewDelegate — hantering av redigering och bearbetning av klick på länkar och bilagor
  • Data Detector Types — automatisk detektering av URL, telefon, adresser och datum via NSDataDetector
  • Text Container — system med exclusionPaths, lineFragmentPadding och textContainerInset för layout
  • Placeholder — inte inbyggd, implementeras via UILabel eller attributedText med grå färg
  • Dynamisk höjd — contentSize-övervakning och uppdatering av begränsningar för automatisk höjd
  • UITextView skiljer sig från UITextField genom stöd för flerradighet, attribut, rullning och data detectors

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.

Diskutera projektet

Läs också