UITextView: o que é, entrada multilinha e princípio de funcionamento

Autor: IT Sectr Publicado: 2026-07-07 Tempo de leitura: 8 min

UITextView é um componente de texto multilinha do UIKit, herdando de UIScrollView e suportando edição de texto atribuído com incorporação de links e imagens. De acordo com a documentação da Apple Developer (2025), o UITextView fornece UITextViewDelegate com callbacks textViewDidChange, shouldInteractWithURL e shouldInteractWithTextAttachment para manipulação de interações. Ao contrário do UITextField, o UITextView suporta rolagem, estilos de texto via typingAttributes e dataDetectorTypes para deteção automática de links, endereços e datas. Este é o componente principal para exibir conteúdo e inserir texto multilinha em aplicações iOS.

Principais Pontos

  • UITextView — campo de texto multilinha no UIKit, herdeiro de UIScrollView com suporte a edição
  • NSAttributedString — suporte a texto atribuído: fontes, cores, espaçamento entre linhas, links
  • UITextViewDelegate — gestão através de textViewDidChange, shouldInteractWithURL, didBeginEditing
  • Data Detector Types — deteção automática de links, endereços, datas, números de telefone
  • Text Container — sistema de textContainer, exclusionPaths e lineFragmentPadding para layout personalizado

O que é UITextView

UITextView é um componente UIKit projetado para exibir e editar texto multilinha. Ao contrário do UILabel, o UITextView suporta seleção de texto, edição, rolagem quando o conteúdo excede o tamanho e texto atribuído. Sendo uma subclasse de UIScrollView, o UITextView inclui automaticamente rolagem vertical e horizontal quando o conteúdo transborda — isto é configurado através de isScrollEnabled. A classe suporta edição através da propriedade isEditable: defina como false para modo somente leitura. O UITextView funciona com NSLayoutManager através do sistema TextKit: NSTextStorage (armazenamento de texto atribuído) → NSLayoutManager (layout de linhas) → NSTextContainer (geometria da área de texto). Esta arquitetura permite layouts personalizados com ajuste de imagens, texto multicoluna e layouts de texto complexos. O UITextView é usado para exibir artigos, descrições, registos, comentários e qualquer texto multilinha em iOS.

UITextView vs UITextField: Diferenças Principais

A diferença entre UITextView e UITextField vai muito além do número de linhas. UITextField é um UIControl de linha única com suporte a placeholder, vistas esquerda/direita e botão limpar. UITextView é um UIScrollView multilinha com um sistema TextKit completo para texto atribuído. UITextField não suporta NSAttributedString ao nível de exibição (apenas via attributedText com limitações), UITextView lida com NSAttributedString completamente com diferentes fontes, estilos de parágrafo e imagens incorporadas. UITextField tem um botão limpar embutido (clearButtonMode), UITextView não — é necessária uma implementação personalizada. UITextView redimensiona-se automaticamente ao conteúdo (intrinsicContentSize), UITextView requer gestão manual de altura através da observação de contentSize ou restrições de Auto Layout. UITextView suporta dataDetectorTypes (deteção automática de links), UITextField suporta desde iOS 16+. Para entrada de texto multilinha (comentários, notas, mensagens) escolha UITextView. Para campos de formulário (nome, email, senha) use UITextField.

CaracterísticaUITextViewUITextField
LinhasMultilinhaLinha única
PlaceholderNão (personalizado)Embutido
Atributos de textoNSAttributedString completoLimitado
Data DetectorsSuporte completoiOS 16+
Imagens inlineVia NSTextAttachmentNão suportado
RolagemEmbutida (UIScrollView)Não
Vista Esq./Dir.NãoEmbutida

NSAttributedString e Formatação de Texto

NSAttributedString é uma capacidade fundamental do UITextView que o distingue do UITextField e UILabel. Uma string atribuída permite definir diferentes fontes, cores, espaçamento entre linhas, alinhamento e links dentro de um único texto. Propriedades: textView.attributedText = attributedString. Atributos chave do NSAttributedString.Key: font (.systemFont, .boldSystemFont, UIFont personalizado), foregroundColor, backgroundColor, paragraphStyle (NSMutableParagraphStyle com lineSpacing, alignment, lineBreakMode), link (URL para links interativos), underlineStyle, strikethroughStyle, shadow, baselineOffset, kern (espaçamento entre letras). Para criar um attributedString use init(string:, attributes:) ou NSMutableAttributedString para adicionar atributos a diferentes intervalos. O UITextView exibe automaticamente os links (atributo link) como interativos — ao pressioná-los, o método delegado shouldInteractWithURL é acionado. Para redefinir atributos para nova entrada use 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

UITextViewDelegate e Manipulação de Links

UITextViewDelegate é um protocolo que gere a edição e a interação com o texto. Métodos principais: textViewDidBeginEditing(textView) — chamado quando a edição começa; textViewDidEndEditing — quando a edição termina; textViewDidChange — em cada alteração de texto; textViewDidChangeSelection — quando a seleção muda; textViewShouldInteractWithURL — quando um link é tocado (retorna Bool, permite a transição); textViewShouldInteractWithTextAttachment — quando uma imagem incorporada é tocada. Para manipular links dentro de UITextView substitua shouldInteractWithURL — nele pode: abrir URL no SFSafariViewController, mostrar UIAlertController para confirmação, lidar com esquemas URL personalizados. Importante: se textView.isEditable = true, os links ficam indisponíveis para um único toque — é necessário toque duplo. Para links interativos em textView editável use gesture recognizers.

Manipulação de Links via SFSafariViewController

SFSafariViewController é a forma padrão de abrir links em aplicações iOS. No método shouldInteractWithURL crie SFSafariViewController com o URL e apresente-o modalmente ou através de navigationController. Para links universais use UIApplication.shared.open(url, options) — mas isto sai da aplicação. Para evitar a abertura de links retorne false em shouldInteractWithURL e lide com o URL você mesmo.

Sistema Text Container: Margens e Exclusion Paths

NSTextContainer faz parte da arquitetura TextKit, definindo a área geométrica onde o texto do UITextView é exibido. Cada UITextView tem um textContainer padrão, configurável através de: textView.textContainerInset — margens do texto das bordas do textView (UIEdgeInsets); textView.textContainer.lineFragmentPadding — preenchimento horizontal dentro de cada linha; textView.textContainer.maximumNumberOfLines — limite de linhas (0 = sem limite); textView.textContainer.exclusionPaths — matriz de UIBezierPath para áreas que o texto deve contornar (imagens, formas personalizadas). ExclusionPaths permitem layouts complexos: o texto contorna uma imagem de perfil circular, um ícone ou qualquer forma arbitrária. Para altura dinâmica do UITextView observe contentSize através de KVO ou delegado e atualize as restrições.

swift
// Dynamic UITextView height 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 for image wrapping
let imageFrame = CGRect(x: 16, y: 100, width: 80, height: 80)
let exclusionPath = UIBezierPath(rect: imageFrame)
textView.textContainer.exclusionPaths = [exclusionPath]

Data Detector Types: Deteção Automática

dataDetectorTypes é uma propriedade do UITextView que reconhece automaticamente e torna interativos certos tipos de dados no texto: .link (URL, email), .phoneNumber (números de telefone), .address (endereços), .calendarEvent (datas e eventos), .flightNumber (números de voo), .lookupSuggestion (sugestões de pesquisa), .trackingNumber (números de rastreio), .money (quantias), .shipmentTrackingNumber, .all (todos os tipos). O Data Detector funciona com NSDataDetector e URL, realçando automaticamente os dados detetados. Para personalizar a manipulação defina dataDetectorTypes e substitua shouldInteractWithURL no delegado. Importante: dataDetectorTypes funciona apenas para URL e phoneNumber sem configuração adicional — outros tipos podem exigir iOS 16+. O Data Detector não entra em conflito com o atributo link no NSAttributedString — ambos os mecanismos funcionam em paralelo. Para UITextView somente leitura com conteúdo (notícias, artigos) defina dataDetectorTypes = [.link, .phoneNumber].

  • .link — URLs, endereços de email; exibidos como links azuis
  • .phoneNumber — números de telefone; toque mostra ação de Chamada
  • .address — endereços postais; toque abre o Maps
  • .calendarEvent — datas e horas; toque cria evento de calendário
  • .flightNumber — números de voo (iOS 16+); verificação rápida de voo

Exemplos de Código com UITextView

Vejamos dois exemplos práticos de uso do UITextView em aplicações iOS. O primeiro — uma vista de texto somente leitura com texto atribuído e detetor de dados para exibir conteúdo. O segundo — uma vista de texto editável com placeholder preguiçoso e altura dinâmica para um formulário de comentários. Ambos os exemplos utilizam as melhores práticas do UIKit: protocolo delegado, Auto Layout e TextKit.

UITextView Somente Leitura com Conteúdo e Links

O modo somente leitura é ativado definindo isEditable = false e isSelectable = true. Isto permite ao utilizador selecionar texto e tocar em links, mas não editar. Defina dataDetectorTypes para deteção automática de links, backgroundColor = .clear para fundo transparente. Para conteúdo longo use attributedText com NSMutableParagraphStyle lineSpacing para legibilidade. Adicione atributos link para links chave dentro do texto.

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 }
        // Load content from URL and set attributedText
    }
}

UITextView Editável com Placeholder

O Placeholder para UITextView não está embutido — implemente-o através de um UILabel sobre o textView ou através de attributedText com verificação de isEmpty. Uma abordagem simples: um UILabel com texto cinzento que se esconde quando a edição começa. Em textViewDidChange verifique a presença de texto e oculte/mostre o placeholder. Para uma solução mais elegante use a propriedade typingAttributes para definir a cor do texto de entrada. A altura dinâmica do textView é alcançada observando contentSize e atualizando as restrições — este é um padrão padrão para chats e formulários de comentários.

Perguntas Frequentes

Como adicionar um placeholder ao UITextView?

UITextView não tem um placeholder embutido. A solução padrão: adicione um UILabel com texto cinzento sobre o textView. Em textViewDidBeginEditing esconda a etiqueta, em textViewDidEndEditing mostre-a se o texto estiver vazio. Alternativamente: use attributedText com cor cinzenta como placeholder e redefina-o quando a edição começar. Para uma solução pronta a usar, use a biblioteca KMPlaceholderTextView ou ReactorKit.

Como remover as margens no UITextView?

Defina textContainerInset = .zero e lineFragmentPadding = 0: textView.textContainerInset = UIEdgeInsets.zero; textView.textContainer.lineFragmentPadding = 0. Adicionalmente: textView.contentInset = .zero. Isto removerá completamente as margens das bordas do textView até ao texto. Note que o lineFragmentPadding padrão é 5.

Porque é que o UITextView não abre links?

Verifique: isSelectable = true (necessário para interação), dataDetectorTypes inclui .link, o delegado não retorna false em shouldInteractWithURL. Se textView.isEditable = true, os links ficam indisponíveis para um único toque — é necessário toque duplo. Para links interativos em textView editável adicione UITapGestureRecognizer sobre o textView e lide com os URL manualmente.

Como fazer um UITextView de altura fixa com rolagem?

Defina isScrollEnabled = true e adicione uma restrição de altura com um valor fixo. O texto que exceder a altura será rolado. Para UX ideal use maxHeight: observe contentSize e defina a restrição de altura não superior a maxHeight. Quando maxHeight for excedido ative scrollEnabled. Este é um padrão padrão para campos de entrada de mensagens e comentários.

Como inserir uma imagem no UITextView?

Use NSTextAttachment: crie um objeto, defina a imagem e os bounds, depois crie um NSAttributedString a partir do anexo e insira-o em textView.attributedText. Exemplo: let attachment = NSTextAttachment(); attachment.image = image; attachment.bounds = CGRect(x, y, width, height); let attributedString = NSAttributedString(attachment: attachment). A imagem será exibida inline no texto e será rolada com ele.

Resumo

  • UITextView — componente de texto multilinha no UIKit, herdeiro de UIScrollView com suporte TextKit
  • NSAttributedString — capacidade chave para formatar fontes, cores, links e parágrafos
  • UITextViewDelegate — gestão de edição e manipulação de toques em links e anexos
  • Data Detector Types — deteção automática de URL, telefones, endereços e datas via NSDataDetector
  • Text Container — sistema com exclusionPaths, lineFragmentPadding e textContainerInset para layout
  • Placeholder — não embutido, implementado via UILabel ou attributedText com cor cinzenta
  • Altura dinâmica — observação de contentSize e atualização de restrições para altura automática
  • UITextView difere de UITextField no suporte a multilinha, atributos, rolagem e data detectors

Vamos desenvolver um aplicativo móvel chave na mão

A IT Sectr cria aplicativos para iOS e Android para startups e empresas desde 2017. Nós vamos aconselhá-lo e propor a melhor solução.

Discutir o projeto

Leia também