UIPlaceholderTextView.h
@interface UIPlaceholderTextView : UITextView
@property (nonatomic, strong) NSString *placeholder;
@property (nonatomic, strong) UIColor *placeholderColor;
UIPlaceholderTextView.m
CGFloat kEdge = 8.0;
@interface UIPlaceholderTextView ()
@property (nonatomic, strong) UILabel *placeholderLabel;
@end
@implementation UIPlaceholderTextView
- (void)dealloc {
[[NSNotificationCenter defaultCenter] removeObserver:self];
}
- (UILabel *)placeholderLabel {
if (nil == _placeholderLabel) {
_placeholderLabel = [[UILabel alloc] initWithFrame:CGRectMake(kEdge, kEdge, self.bounds.size.width - 2 * kEdge, self.bounds.size.height - 2 * kEdge)];
_placeholderLabel.font = self.font;
_placeholderLabel.numberOfLines = 0;
_placeholderLabel.alpha = 0.0;
_placeholderLabel.lineBreakMode = NSLineBreakByCharWrapping;
_placeholderLabel.backgroundColor = [UIColor clearColor];
}
return _placeholderLabel;
}
- (void)awakeFromNib {
[super awakeFromNib];
if (self.placeholder.length == 0) {
self.placeholder = @"";
}
if (!self.placeholderColor) {
self.placeholderColor = [UIColor lightGrayColor];
}
[self addSubview:self.placeholderLabel];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textViewContentChanged:) name:UITextViewTextDidChangeNotification object:nil];
}
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
if (self.placeholder.length == 0) {
self.placeholder = @"";
}
if (!self.placeholderColor) {
self.placeholderColor = [UIColor lightGrayColor];
}
[self addSubview:self.placeholderLabel];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textViewContentChanged:) name:UITextViewTextDidChangeNotification object:nil];
}
return self;
}
- (void)textViewContentChanged:(NSNotification *)notification {
if (self.placeholder.length == 0) {
return;
}
if (self.text.length) {
self.placeholderLabel.alpha = 0.0;
}
else {
self.placeholderLabel.alpha = 1.0;
}
}
- (void)setText:(NSString *)text {
[super setText:text];
[self textViewContentChanged:nil];
}
// Only override drawRect: if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
- (void)drawRect:(CGRect)rect
{
if (self.placeholder.length) {
self.placeholderLabel.text = self.placeholder;
self.placeholderLabel.textColor = self.placeholderColor;
[self.placeholderLabel sizeToFit];
[self sendSubviewToBack:self.placeholderLabel];
}
if (self.text.length == 0 && self.placeholderLabel.text.length) {
self.placeholderLabel.alpha = 1.0;
}
}
@end