iOS -自定義鍵盤系列之一怎樣自定義輸入文本框

前言####

我們系統可以輸入內容的控件有UITextField和UITextView,兩者特點有:
UITextField:可以設置占位文字,但是不能輸入多行。
UITextView:不可以設置占位文字,但是可以輸入多行。
但是往往我們的需求是兩者的結合體:設置占位文字,可以輸入多行。所以我們需要自定義輸入文本框。

UITextView內部參考結構:

UITextView內部結構.png
UITextView內部結構.png

自定義的輸入框效果


自定義TextView.gif
自定義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
自定義輸入框.png

本demo的集成只需要兩個文件,耦合性低
詳情代碼請直接下載demo查看:
自定義鍵盤-LZBKeyBoardView

輸入框其他資源:自定義鍵盤系列之二鍵盤自適應響應者

最后贈言###

star 是對我們程序猿最大的鼓勵

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容