在前兩篇1 、2中,實(shí)現(xiàn)了輸入框的界面和動(dòng)畫效果,那么如何像textfield那樣獲取焦點(diǎn),彈出鍵盤輸入內(nèi)容呢。
思路分析
目前能想到的思路如下:
1.喚起系統(tǒng)鍵盤及獲取鍵盤輸入,直接使用系統(tǒng)的數(shù)字鍵盤。
2.自定義一個(gè)鍵盤,點(diǎn)擊時(shí),彈出鍵盤,然后再鍵盤輸入時(shí)進(jìn)行關(guān)聯(lián)操作。
3.在view中隱式放置一個(gè)textfield,監(jiān)聽其內(nèi)容變化,進(jìn)行重繪。
實(shí)現(xiàn)過程
以上三種方法,第2種有特殊的適用情況,所以一般在1和3之間選擇,如果不知道怎么調(diào)用系統(tǒng)鍵盤的話,可以用3來實(shí)現(xiàn),效果其實(shí)差不多。
通過UITextField可以看到,UIKeyboardType是在UITextInputTraits.h文件中的UITextInputTraits協(xié)議。
直接遵循UITextInputTraits進(jìn)行試驗(yàn),發(fā)現(xiàn)并沒有彈出鍵盤。
然后在查詢的時(shí)候發(fā)現(xiàn)了這篇文章,實(shí)踐時(shí),在UITextInput.h中發(fā)現(xiàn)了UIKeyInput這個(gè)協(xié)議,根據(jù)名字猜測(cè)可能是與鍵盤的輸入有關(guān),跟著就查到了這篇文章。根據(jù)文中的知識(shí),就可以實(shí)現(xiàn)鍵盤的彈出和輸入的監(jiān)聽了。
具體代碼
1.修改view的父類為UIControl,同時(shí)添加一個(gè)屬性,表示是否可以編輯(如果用在自定義鍵盤界面里,設(shè)置為NO就不會(huì)彈出系統(tǒng)鍵盤了)
//是否可以編輯,默認(rèn)設(shè)為YES
@property (nonatomic, assign) IBInspectable BOOL editable;
// 點(diǎn)擊時(shí),獲取焦點(diǎn)
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
[super touchesBegan:touches withEvent:event];
[self becomeFirstResponder];
}
// 返回值決定了是否可以獲得焦點(diǎn)
-(BOOL)canBecomeFirstResponder{
return self.editable;
}
// 獲得焦點(diǎn)的方法
- (BOOL)becomeFirstResponder {
BOOL result = [super becomeFirstResponder];
if (result == YES) {
[self sendActionsForControlEvents:UIControlEventEditingDidBegin];
}
return result;
}
// 返回值決定是否可以注銷焦點(diǎn)
- (BOOL)canResignFirstResponder {
return YES;
}
// 注銷焦點(diǎn)
- (BOOL)resignFirstResponder {
BOOL result = [super resignFirstResponder];
[self startTextChangeAnimation];
if (result) {
[self sendActionsForControlEvents:UIControlEventEditingDidEnd];
}
return result;
}
2.遵循UIKeyInput協(xié)議,并實(shí)現(xiàn)協(xié)議方法:
#pragma mark - UIKeyInput Protocal
//返回彈出鍵盤的類型(這里指定只能彈出數(shù)字鍵盤)
- (UIKeyboardType)keyboardType {
return UIKeyboardTypeNumberPad;
}
//返回是否已經(jīng)有內(nèi)容
- (BOOL)hasText {
return _text != nil && _text.length > 0;
}
//鍵盤的內(nèi)容輸入時(shí)會(huì)調(diào)用
- (void)insertText:(NSString *)text {
if (_text.length >= self.boxCount) {
if (_autoResignFirstResponderWhenInputFinished == YES) {
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
[self resignFirstResponder];
}];
}
return;
}
if ([text isEqualToString:@" "]) {
return;
}
if ([self.delegate respondsToSelector:@selector(passwordView:shouldChangeCharactersInRange:replacementString:)]) {
if ([self.delegate passwordView:self shouldChangeCharactersInRange:NSMakeRange(_text.length - 1, 1) replacementString:text] == NO) {
return;
}
}
NSMutableString *str = [NSMutableString stringWithString:_text];
[str appendString:text];
_text = str;
if (_text.length >= _boxCount) {
[str deleteCharactersInRange:NSMakeRange(_boxCount, str.length - _boxCount)];
[self sendActionsForControlEvents:UIControlEventEditingChanged];
if (_autoResignFirstResponderWhenInputFinished == YES) {
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
[self resignFirstResponder];
}];
}
} else {
[self sendActionsForControlEvents:UIControlEventEditingChanged];
}
[self startTextChangeAnimation];
}
//刪除鍵按下時(shí)會(huì)調(diào)用
- (void)deleteBackward {
if ([self hasText] == NO)
return;
NSMutableString *str = [NSMutableString stringWithString:self.text];
if (str.length) {
[str deleteCharactersInRange:NSMakeRange(str.length-1, 1)];
}
self.text = str;
[self sendActionsForControlEvents:UIControlEventEditingChanged];
[self startTextChangeAnimation];
}
3.試下效果

以上,鍵盤的彈出效果就加上了。
下一篇,對(duì)一些細(xì)節(jié)進(jìn)行補(bǔ)充。