Por que UITextView não tem placeholder embutido e como contornar isso
\n\nTodo 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.
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.
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á!
Método 1: UILabel clássico sobre UITextView
\n\nA 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.
Como funciona
\n\nVocê 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:
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\nImportante: 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.
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
NSAttributedStringcom diferentes alinhamentos. \n
Método 2: Placeholder via NSAttributedString
\n\nUma 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\nEste método é especialmente útil se você estiver trabalhando com UITextView em Swift e não quiser se preocupar com views adicionais.
\n\nImplementação
\n\nimport UIKit\n\nclass ViewController: UIViewController, UITextViewDelega