前言####
我们系统可以输入内容的控件有UITextField和UITextView,两者特点有:
UITextField:可以设置占位文字,但是不能输入多行。
UITextView:不可以设置占位文字,但是可以输入多行。
但是往往我们的需求是两者的结合体:设置占位文字,可以输入多行。所以我们需要自定义输入文本框。
UITextView内部参考结构:
自定义的输入框效果
怎样自定义输入框####
1、自定义输入框是继承UITextView的子类(原因:UITextField只能输入单行),但是我们需要加入占位文字功能
2、自定义的输入文本框需要具有哪些功能?网上虽然有很多自定义控件,但是API完全不够使用,我觉得完整的输入文本框应该具有以下功能:
/**
* 设置占位文字
*/
@property (nonatomic, copy) NSString *placeholder;
/**
* 设置占位文字颜色
*/
@property (nonatomic, strong) UIColor *placeholderColor;
/**
* 占位文字的X偏移量
*/
@property (nonatomic, assign) CGFloat placeHolderOffsetX;
/**
* 占位文字的Y偏移量
*/
@property (nonatomic, assign) CGFloat placeHolderOffsetY;
/**
* 光标的偏移量
*/
@property (nonatomic, assign) UIOffset cursorOffset;
/**
* 是否隐藏
*/
@property (nonatomic, assign) BOOL placeHolderHidden;
3、具体实现
3.1 初始化的时候增加占位文字控件,并且增加监听输入文字的通知
- (instancetype)initWithFrame:(CGRect)frame
{
if(self = [super initWithFrame:frame])
{
[self addSubview:self.placeholderLabel];
self.alwaysBounceVertical = YES;
self.font = [UIFont systemFontOfSize:14.0];
self.placeholderColor = [UIColor grayColor];
self.placeholderLabel.frame = CGRectMake(5, 10, 0, 0);
// 监听文字改变
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textDidChange) name:UITextViewTextDidChangeNotification object:nil];
}
return self;
}
3.2 核心代码就是计算占位文字的Size来设置占位Label的frame
-(void)computePlaceholderLabelSize
{
CGFloat maxWidth = [UIScreen mainScreen].bounds.size.width - 2 * (self.placeholderLabel.frame.origin.x - self.placeHolderOffsetX);
CGSize maxSize = CGSizeMake(maxWidth, MAXFLOAT);
CGSize computeSize = [self.placeholder boundingRectWithSize:maxSize options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading attributes:@{NSFontAttributeName : self.font} context:nil].size;
CGRect frame = self.placeholderLabel.frame;
frame.size = computeSize;
frame.origin.x = self.placeHolderOffsetX + frame.origin.x;
frame.origin.y = self.placeHolderOffsetY + frame.origin.y;
self.placeholderLabel.frame = frame;
}
3.3 通知监听到输入文字,就会自动隐藏占位Label
- (void)textDidChange
{
self.placeHolderHidden = self.hasText; //这个方法可以实现自定隐藏
}
注意:有通知,必须要移除通知
- (void)dealloc
{
[[NSNotificationCenter defaultCenter] removeObserver:self];
}
3.4 API接口的实现就不做详细描述,需要查看详细内容,请下载demo
本demo的集成只需要两个文件,耦合性低
详情代码请直接下载demo查看:
自定义键盘-LZBKeyBoardView
输入框其他资源:自定义键盘系列之二键盘自适应响应者
最后赠言###
star 是对我们程序猿最大的鼓励