前言####
我們系統可以輸入內容的控件有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 初始化的時候增加占位文字控件,并且增加監(jiān)聽輸入文字的通知
- (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);
// 監(jiān)聽文字改變
[[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 通知監(jiān)聽到輸入文字篮撑,就會自動隱藏占位Label
- (void)textDidChange
{
self.placeHolderHidden = self.hasText; //這個方法可以實現自定隱藏
}
注意:有通知减细,必須要移除通知
- (void)dealloc
{
[[NSNotificationCenter defaultCenter] removeObserver:self];
}
3.4 API接口的實現就不做詳細描述,需要查看詳細內容赢笨,請下載demo

自定義輸入框.png
本demo的集成只需要兩個文件未蝌,耦合性低
詳情代碼請直接下載demo查看:
自定義鍵盤-LZBKeyBoardView
輸入框其他資源:自定義鍵盤系列之二鍵盤自適應響應者
最后贈言###
star 是對我們程序猿最大的鼓勵