從0開始自定義一個(gè)支付密碼輸入框(3)

在前兩篇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ǔ)充。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,366評(píng)論 25 708
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 15,828評(píng)論 4 61
  • 假如我死了, 我要平靜的躺在, 白雪覆蓋的山野, 靜等生命的聲音逐漸微弱, 讓思想和靈魂, 屹立萬古,永保新鮮。 ...
    山河一夢(mèng)閱讀 410評(píng)論 1 5
  • 分享一個(gè)會(huì)烤肉的女子,她會(huì)照顧我們的一切,把我們當(dāng)做妹妹一樣。
    焉咸菜閱讀 171評(píng)論 0 0
  • 剛過夏至,70多歲的公公婆婆從千里之外的老家坐了一夜的綠皮火車來到無錫,在接站口,看到二老熟悉的身...
    田字格格閱讀 455評(píng)論 0 1

友情鏈接更多精彩內(nèi)容