// // IQTextView.m // https://github.com/hackiftekhar/IQKeyboardManager // Copyright (c) 2013-16 Iftekhar Qurashi. // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. #import "IQTextView.h" #import #import #import @interface IQTextView () @property(nonatomic, strong) UILabel *placeholderLabel; @end @implementation IQTextView @synthesize placeholder = _placeholder; @synthesize placeholderLabel = _placeholderLabel; @synthesize placeholderTextColor = _placeholderTextColor; -(void)initialize { [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(refreshPlaceholder) name:UITextViewTextDidChangeNotification object:self]; } -(void)dealloc { [_placeholderLabel removeFromSuperview]; _placeholderLabel = nil; [[NSNotificationCenter defaultCenter] removeObserver:self]; } - (instancetype)init { self = [super init]; if (self) { [self initialize]; } return self; } -(void)awakeFromNib { [super awakeFromNib]; [self initialize]; } -(void)refreshPlaceholder { if([[self text] length]) { [_placeholderLabel setAlpha:0]; } else { [_placeholderLabel setAlpha:1]; } [self setNeedsLayout]; [self layoutIfNeeded]; } - (void)setText:(NSString *)text { [super setText:text]; [self refreshPlaceholder]; } -(void)setFont:(UIFont *)font { [super setFont:font]; self.placeholderLabel.font = self.font; [self setNeedsLayout]; [self layoutIfNeeded]; } -(void)setTextAlignment:(NSTextAlignment)textAlignment { [super setTextAlignment:textAlignment]; self.placeholderLabel.textAlignment = textAlignment; [self setNeedsLayout]; [self layoutIfNeeded]; } -(void)layoutSubviews { [super layoutSubviews]; CGFloat offsetLeft = self.textContainerInset.left + self.textContainer.lineFragmentPadding; CGFloat offsetRight = self.textContainerInset.right + self.textContainer.lineFragmentPadding; CGFloat offsetTop = self.textContainerInset.top; CGFloat offsetBottom = self.textContainerInset.bottom; CGSize expectedSize = [self.placeholderLabel sizeThatFits:CGSizeMake(CGRectGetWidth(self.frame)-offsetLeft-offsetRight, CGRectGetHeight(self.frame)-offsetTop-offsetBottom)]; self.placeholderLabel.frame = CGRectMake(offsetLeft, offsetTop, expectedSize.width, expectedSize.height); } -(void)setPlaceholder:(NSString *)placeholder { _placeholder = placeholder; self.placeholderLabel.text = placeholder; [self refreshPlaceholder]; } -(void)setPlaceholderTextColor:(UIColor*)placeholderTextColor { _placeholderTextColor = placeholderTextColor; self.placeholderLabel.textColor = placeholderTextColor; } -(UILabel*)placeholderLabel { if (_placeholderLabel == nil) { _placeholderLabel = [[UILabel alloc] init]; _placeholderLabel.autoresizingMask = (UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight); _placeholderLabel.lineBreakMode = NSLineBreakByWordWrapping; _placeholderLabel.numberOfLines = 0; _placeholderLabel.font = self.font; _placeholderLabel.textAlignment = self.textAlignment; _placeholderLabel.backgroundColor = [UIColor clearColor]; _placeholderLabel.textColor = [UIColor colorWithWhite:0.7 alpha:1.0]; _placeholderLabel.alpha = 0; [self addSubview:_placeholderLabel]; } return _placeholderLabel; } //When any text changes on textField, the delegate getter is called. At this time we refresh the textView's placeholder -(id)delegate { [self refreshPlaceholder]; return [super delegate]; } @end