UITextField *textField默认的情况
1.只能显示一行文字
2.有占位文字
UITextView *textView默认的情况
2.能显示任意行文字
2.没有占位文字
文本输入控件,最终希望拥有的功能
1.能显示任意行文字
2.有占位文字
最终的方案:
1.继承自UITextView
2.在UITextView能显示任意行文字的基础上,增加”有占位文字”的功能
二、首先新建一个ZJPlaceholderTextView,.h文件如下
#import <UIKit/UIKit.h>
@interface ZJPlaceholderTextView : UITextView
/** 占位文字 */
@property (nonatomic, copy) NSString *placeholder;
/** 占位文字的颜色 */
@property (nonatomic, strong) UIColor *placeholderColor;
第二步、.m文件如下:
#import "ZJPlaceholderTextView.h"
@interface ZJPlaceholderTextView()
/** 占位文字label */
@property (nonatomic, weak) UILabel *placeholderLabel;
@end
@implementation ZJPlaceholderTextView
- (UILabel *)placeholderLabel
{
if (!_placeholderLabel) {
// 添加一个用来显示占位文字的label
UILabel *placeholderLabel = [[UILabel alloc] init];
placeholderLabel.numberOfLines = 0;
placeholderLabel.x = 4;
placeholderLabel.y = 7;
[self addSubview:placeholderLabel];
_placeholderLabel = placeholderLabel;
}
return _placeholderLabel;
}
- (instancetype)initWithFrame:(CGRect)frame
{
if (self = [super initWithFrame:frame]) {
// 垂直方向上永远有弹簧效果
self.alwaysBounceVertical = YES;
// 默认字体
self.font = [UIFont systemFontOfSize:15];
// 默认的占位文字颜色
self.placeholderColor = [UIColor grayColor];
// 监听文字改变
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textDidChange) name:UITextViewTextDidChangeNotification object:nil];
}
return self;
}
- (void)dealloc
{
[[NSNotificationCenter defaultCenter] removeObserver:self];
}
/**
* 监听文字改变
*/
- (void)textDidChange
{
// 只要有文字, 就隐藏占位文字label
self.placeholderLabel.hidden = self.hasText;
}
/**
* 更新占位文字的尺寸
*/
- (void)layoutSubviews
{
[super layoutSubviews];
self.placeholderLabel.width = self.width - 2 * self.placeholderLabel.x;
[self.placeholderLabel sizeToFit];
}
#pragma mark - 重写setter
- (void)setPlaceholderColor:(UIColor *)placeholderColor
{
_placeholderColor = placeholderColor;
self.placeholderLabel.textColor = placeholderColor;
}
- (void)setPlaceholder:(NSString *)placeholder
{
_placeholder = [placeholder copy];
self.placeholderLabel.text = placeholder;
[self setNeedsLayout];
}
- (void)setFont:(UIFont *)font
{
[super setFont:font];
self.placeholderLabel.font = font;
[self setNeedsLayout];
}
- (void)setText:(NSString *)text
{
[super setText:text];
[self textDidChange];
}
- (void)setAttributedText:(NSAttributedString *)attributedText
{
[super setAttributedText:attributedText];
[self textDidChange];
}
/**
* setNeedsDisplay方法 : 会在恰当的时刻自动调用drawRect:方法
* setNeedsLayout方法 : 会在恰当的时刻调用layoutSubviews方法
*/
@end