New file |
| | |
| | | // |
| | | // 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 <UIKit/NSTextContainer.h> |
| | | #import <UIKit/UILabel.h> |
| | | #import <UIKit/UINibLoading.h> |
| | | |
| | | @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<UITextViewDelegate>)delegate |
| | | { |
| | | [self refreshPlaceholder]; |
| | | return [super delegate]; |
| | | } |
| | | |
| | | @end |