iOS -自定义键盘系列之一怎样自定义输入文本框

前言####

我们系统可以输入内容的控件有UITextField和UITextView,两者特点有:
UITextField:可以设置占位文字,但是不能输入多行。
UITextView:不可以设置占位文字,但是可以输入多行。
但是往往我们的需求是两者的结合体:设置占位文字,可以输入多行。所以我们需要自定义输入文本框。

UITextView内部参考结构:

UITextView内部结构.png

自定义的输入框效果


自定义TextView.gif

怎样自定义输入框####

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

自定义输入框.png

本demo的集成只需要两个文件,耦合性低
详情代码请直接下载demo查看:
自定义键盘-LZBKeyBoardView

输入框其他资源:自定义键盘系列之二键盘自适应响应者

最后赠言###

star 是对我们程序猿最大的鼓励

你可能感兴趣的:(iOS -自定义键盘系列之一怎样自定义输入文本框)