Add placeholder support to UITextView
This post will show you how to apply the UITextField
placeholder behavior to a
UITextView
, which natively lacks this support.
I basically solved this by adding two extension functions to UITextView
:
public extension UITextView {
public func setupPlaceholder(text: String, textColor: UIColor) {
guard self.text.isEmpty else { return }
self.text = text
self.textColor = color
}
public func setupPlaceholderBeforeEditing(
textColor: UIColor,
placeholderColor: UIColor) {
guard self.textColor == placeholderColor else { return }
self.text = ""
self.textColor = textColor
}
}
As you can see, the placeholder text and color is customizable. However, I add app-specific extensions that call the functions with app-specific colors, so I don’t have to pass around colors everywhere.
Whenever I create a text view, I run setupPlaceholder(...)
to setup a standard
placeholder text. This operation will abort if the view already has text content.
When editing begins, I call setupPlaceholderBeforeEditing(...)
to ensure that
the placeholder text is correctly removed and prepare the view for editing. To
determine if the view currently displays the placeholder, we compare the text
and placeholder colors. However, this requires that we use different text colors
for text and placeholder text.
Whenever editing ends, I call setupPlaceholder(...)
once again to re-apply the
placeholder, if the user hasn’t entered any text.