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 é 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.
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ística | UITextView | UITextField |
|---|---|---|
| Linhas | Multilinha | Linha única |
| Placeholder | Não (personalizado) | Embutido |
| Atributos de texto | NSAttributedString completo | Limitado |
| Data Detectors | Suporte completo | iOS 16+ |
| Imagens inline | Via NSTextAttachment | Não suportado |
| Rolagem | Embutida (UIScrollView) | Não |
| Vista Esq./Dir. | Não | Embutida |
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.
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 é 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.
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.
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.
// 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]
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].
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.
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.
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
}
}
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
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.
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.
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.
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.
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
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.
Leia também