How to insert Placeholder in UITextView

Placeholder is something that is required to help user understand what the control is for.

Placeholder in iOS is the information text used to represent user of View.

Placeholder is the instance property of TextField in iOS but as we know like this is not for TextView.

To give placeholder text in TextView and make it behave like TextField we have to play with text color and delegate methods of TextView.

It helps us to distinguish between Placeholder text and typed text using keyboard.

 

placeholder
placeholder

Placeholder

A string that’s displayed in the compose view’s text view when the text view is empty.

Declaration

var placeholder: String! { get set }

Solution #1 – If you want the placeholder to disappear as soon as the user selects the text view:

First set the UITextView to contain the placeholder text and set it to a light gray color to mimic the look of a UITextField’s placeholder text. Either do so in the viewDidLoad or upon the text view’s creation.

textView.text = “Placeholder”
textView.textColor = UIColor.lightGray

Solution #2 – If you want the placeholder to show whenever the text view is empty, even if the text view’s selected:

First set the placeholder in the viewDidLoad:

textView.text = “Placeholder”
textView.textColor = UIColor.lightGray

textView.becomeFirstResponder()

textView.selectedTextRange = textView.textRange(from: textView.beginningOfDocument, to: textView.beginningOfDocument)

 

Format

Objective-C code:

[usernameText setPlaceholder:@"My Placeholder Text"];

Swift 3

If your textField has text, you need to first set text property to nil, then set placeholder text:

textField.text = nil
textField.placeholder = "My Placeholder Text"

fieled?.attributedPlaceholder = NSAttributedString()
// new_Password : our text feild name
new_Password.attributedPlaceholder = NSAttributedString(string: " New Password", attributes: [NSForegroundColorAttributeName : UIColor.white])

Few Examples are below as follows

class ViewController: UIViewController {

let placeholder = "Placeholder"

@IBOutlet weak var textView: UITextView!

override func viewDidLoad() {
super.viewDidLoad()

textView.delegate = self
textView.text = placeholder
textView.textColor = UIColor.lightGrayColor()
textView.selectedTextRange = textView.textRangeFromPosition(textView.beginningOfDocument, toPosition: textView.beginningOfDocument)
}

}
class NotesViewController : UIViewController, UITextViewDelegate {

@IBOutlet var textView : UITextView!
var placeholderLabel : UILabel!

override func viewDidLoad() {
super.viewDidLoad()

textView.delegate = self
placeholderLabel = UILabel()
placeholderLabel.text = "Enter some text..."
placeholderLabel.font = UIFont.italicSystemFont(ofSize: (textView.font?.pointSize)!)
placeholderLabel.sizeToFit()
textView.addSubview(placeholderLabel)
placeholderLabel.frame.origin = CGPoint(x: 5, y: (textView.font?.pointSize)! / 2)
placeholderLabel.textColor = UIColor.lightGray
placeholderLabel.isHidden = !textView.text.isEmpty
}

func textViewDidChange(_ textView: UITextView) {
placeholderLabel.isHidden = !textView.text.isEmpty
}
}

extension ViewController: UITextViewDelegate {

func textView(textView: UITextView, shouldChangeTextInRange range: NSRange, replacementText text: String) -> Bool {

let currentText: NSString = textView.text
let updatedText = currentText.stringByReplacingCharactersInRange(range, withString:text)

if updatedText.isEmpty {
textView.text = placeholder
textView.textColor = UIColor.lightGrayColor()
textView.selectedTextRange = textView.textRangeFromPosition(textView.beginningOfDocument, toPosition: textView.beginningOfDocument)
return false
}
else if textView.textColor == UIColor.lightGrayColor() && !text.isEmpty {
textView.text = nil
textView.textColor = UIColor.blackColor()
}

return true
}

func textViewDidChangeSelection(textView: UITextView) {
if self.view.window != nil {
if textView.textColor == UIColor.lightGrayColor() {
textView.selectedTextRange = textView.textRangeFromPosition(textView.beginningOfDocument, toPosition: textView.beginningOfDocument)
}
}
}

}

in OBJECTIVE-C

 

UIPlaceHolderTextView.h:

#import <Foundation/Foundation.h>

@interface UIPlaceHolderTextView : UITextView

@property (nonatomic, retain) IBInspectable NSString *placeholder;
@property (nonatomic, retain) IBInspectable UIColor *placeholderColor;

-(void)textChanged:(NSNotification*)notification;

@end

UIPlaceHolderTextView.m:

#import "UIPlaceHolderTextView.h"

@interface UIPlaceHolderTextView ()

@property (nonatomic, retain) UILabel *placeHolderLabel;

@end

@implementation UIPlaceHolderTextView

CGFloat const UI_PLACEHOLDER_TEXT_CHANGED_ANIMATION_DURATION = 0.25;

- (void)dealloc
{
[[NSNotificationCenter defaultCenter] removeObserver:self];
#if __has_feature(objc_arc)
#else
[_placeHolderLabel release]; _placeHolderLabel = nil;
[_placeholderColor release]; _placeholderColor = nil;
[_placeholder release]; _placeholder = nil;
[super dealloc];
#endif
}

- (void)awakeFromNib
{
[super awakeFromNib];

// Use Interface Builder User Defined Runtime Attributes to set
// placeholder and placeholderColor in Interface Builder.
if (!self.placeholder) {
[self setPlaceholder:@""];
}

if (!self.placeholderColor) {
[self setPlaceholderColor:[UIColor lightGrayColor]];
}

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textChanged:) name:UITextViewTextDidChangeNotification object:nil];
}

- (id)initWithFrame:(CGRect)frame
{
if( (self = [super initWithFrame:frame]) )
{
[self setPlaceholder:@""];
[self setPlaceholderColor:[UIColor lightGrayColor]];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textChanged:) name:UITextViewTextDidChangeNotification object:nil];
}
return self;
}

- (void)textChanged:(NSNotification *)notification
{
if([[self placeholder] length] == 0)
{
return;
}

[UIView animateWithDuration:UI_PLACEHOLDER_TEXT_CHANGED_ANIMATION_DURATION animations:^{
if([[self text] length] == 0)
{
[[self viewWithTag:999] setAlpha:1];
}
else
{
[[self viewWithTag:999] setAlpha:0];
}
}];
}

- (void)setText:(NSString *)text {
[super setText:text];
[self textChanged:nil];
}

- (void)drawRect:(CGRect)rect
{
if( [[self placeholder] length] > 0 )
{
if (_placeHolderLabel == nil )
{
_placeHolderLabel = [[UILabel alloc] initWithFrame:CGRectMake(8,8,self.bounds.size.width - 16,0)];
_placeHolderLabel.lineBreakMode = NSLineBreakByWordWrapping;
_placeHolderLabel.numberOfLines = 0;
_placeHolderLabel.font = self.font;
_placeHolderLabel.backgroundColor = [UIColor clearColor];
_placeHolderLabel.textColor = self.placeholderColor;
_placeHolderLabel.alpha = 0;
_placeHolderLabel.tag = 999;
[self addSubview:_placeHolderLabel];
}

_placeHolderLabel.text = self.placeholder;
[_placeHolderLabel sizeToFit];
[self sendSubviewToBack:_placeHolderLabel];
}

if( [[self text] length] == 0 && [[self placeholder] length] > 0 )
{
[[self viewWithTag:999] setAlpha:1];
}

[super drawRect:rect];
}

@end