Como adicionar placeholder em UITextView no Swift: guia completo

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Por que UITextView não tem placeholder embutido e como contornar isso

\n\n

Todo desenvolvedor iOS que já trabalhou com UITextView enfrentou o mesmo problema: ao contrário do UITextField, o UITextView não possui uma propriedade placeholder embutida. Você cria um campo de texto multilinha, executa o aplicativo — e vê um retângulo branco vazio. O usuário não entende o que deve digitar ali, e o designer fica insatisfeito.

\n\n

Por que a Apple não adicionou essa propriedade? Historicamente, o UITextView foi posicionado como um elemento para exibir e editar grandes volumes de texto (por exemplo, anotações ou e-mails), e não como um campo de entrada com dica. Mas os tempos mudaram: hoje usamos UITextView para comentários, descrições, biografias — em todos os lugares onde um placeholder é necessário.

\n\n

Neste artigo, abordaremos 3 métodos comprovados para adicionar placeholder text inside UITextView in Swift. Você aprenderá como fazer isso através de UILabel, através de atributos NSAttributedString e através da criação de sua própria subclasse. Vamos lá!

\n\n

Método 1: UILabel clássico sobre UITextView

\n\n

A maneira mais simples e direta é colocar um UILabel sobre o UITextView e gerenciar sua visibilidade. Este método é ideal para iniciantes e para projetos que não exigem personalização complexa.

\n\n

Como funciona

\n\n

Você adiciona um UILabel como elemento filho do UITextView, define o texto do placeholder e o oculta quando o usuário começa a digitar. Aqui está um exemplo passo a passo:

\n\n
import UIKit\n\nclass ViewController: UIViewController, UITextViewDelegate {\n    \n    @IBOutlet weak var textView: UITextView!\n    let placeholderLabel = UILabel()\n    \n    override func viewDidLoad() {\n        super.viewDidLoad()\n        textView.delegate = self\n        setupPlaceholder()\n    }\n    \n    func setupPlaceholder() {\n        placeholderLabel.text = "Digite seu comentário..."\n        placeholderLabel.font = UIFont.systemFont(ofSize: 16)\n        placeholderLabel.textColor = UIColor.lightGray\n        placeholderLabel.translatesAutoresizingMaskIntoConstraints = false\n        textView.addSubview(placeholderLabel)\n        \n        NSLayoutConstraint.activate([\n            placeholderLabel.topAnchor.constraint(equalTo: textView.topAnchor, constant: 8),\n            placeholderLabel.leadingAnchor.constraint(equalTo: textView.leadingAnchor, constant: 5),\n            placeholderLabel.trailingAnchor.constraint(equalTo: textView.trailingAnchor, constant: -5)\n        ])\n    }\n    \n    func textViewDidChange(_ textView: UITextView) {\n        placeholderLabel.isHidden = !textView.text.isEmpty\n    }\n}
\n\n

Importante: não se esqueça de definir o delegate UITextViewDelegate e implementar o método textViewDidChange. Se você estiver usando SwiftUI, a abordagem será diferente — lá é usado o modificador .overlay.

\n\n

Prós e contras

\n
    \n
  • Prós: simplicidade, fácil de entender, funciona em qualquer versão do iOS.
  • \n
  • Contras: é necessário monitorar as constraints, se os insets do textview mudarem. Também não funciona se o textview tiver NSAttributedString com diferentes alinhamentos.
  • \n
\n\n

Método 2: Placeholder via NSAttributedString

\n\n

Uma maneira mais elegante é usar atributos de string. A ideia é exibir o placeholder como texto atribuído com cor cinza e, quando o usuário começar a digitar, substituí-lo pelo texto normal.

\n\n

Este método é especialmente útil se você estiver trabalhando com UITextView em Swift e não quiser se preocupar com views adicionais.

\n\n

Implementação

\n\n
import UIKit\n\nclass ViewController: UIViewController, UITextViewDelega                

Blogs

Book Recommendations