自定义数字键盘

项目中可能需要用到自定义的键盘。学习了下找到的2款数字键盘。自定义键盘可以通过设置UITextField的inputView实现。inputAccessoryView可以设置键盘上的工具条。


自定义数字键盘_第1张图片
1.gif

1. 带小数点常规数字键盘

布局就采用xib了,然后铺满了button,拉满了约束。总之是做到平分、等宽、等高就可以了。另外用代码设置了高亮的背景色。
然后把键盘的使用封装到了控件当中,TTTextFieldTTTextView。使用控件就可以支持数字键盘。

点击的处理,通常会考虑让控件做为代理,然后根据点击的按钮进行text的拼接。可是如果要支持2种控件,就考虑在keyboardView中持有控件,内部进行输入的逻辑判断,修改控件的text内容。

按键事件处理:

- (IBAction)keyboardClick:(id)sender
{
    [[UIDevice currentDevice] playInputClick];
    
    UIButton *btn = (UIButton *)sender;
    NSString *strValue = nil;
    if ([self.textView isKindOfClass:[UITextView class]])
    {
        strValue = ((UITextView *)self.textView).text;
    }
    else if ([self.textView isKindOfClass:[UITextField class]])
    {
        strValue = ((UITextField *)self.textView).text;
    }
    
    // 利用textView 在此处修改text,而不是去textField textView修改2遍
    if ([self.delegate respondsToSelector:@selector(NumberKeyboard:didClickWithButton:)])
    {
        // 这样处理的话 这个代理暂时没有用了
        [self.delegate NumberKeyboard:self didClickWithButton:btn];
    }
    
    if (btn.tag <= 100) // 文本
    {
        [self setTextWithSender:btn OriginalText:strValue];
    }
    else // 功能
    {
        switch (btn.tag)
        {
            case 200: // ABC
            {
                id tempTextView = _textView;
                [tempTextView setInputView:nil];
                [tempTextView reloadInputViews];
                [self addBackKeyboardButton:@"More-Key"];
            }
                break;
            case 201: // del
            {
                if(_textView && [_textView respondsToSelector:@selector(deleteBackward)])
                {
                    [_textView deleteBackward];
                }
                else
                {
                    id tempTextView = _textView;
                    if(strValue.length <= 0)
                        return;
                    // 当前文字
                    NSMutableString* strText = [[NSMutableString alloc] initWithString:[tempTextView text]];
                    // 最后一个字符
                    NSRange theRange = NSMakeRange(strText.length-1, 1);
                    [strText deleteCharactersInRange:theRange];
                    [tempTextView setText:[NSString stringWithFormat:@"%@",strText]];
                    [tempTextView setNeedsDisplay];
                }

            }
                break;
            case 202: // 隐藏
            case 203: // 确定
            {
                
                if ([self.textView isKindOfClass:[UITextView class]])
                    [(UITextView *)self.textView resignFirstResponder];
                
                else if ([self.textView isKindOfClass:[UITextField class]])
                    [(UITextField *)self.textView resignFirstResponder];
            }
                break;
                
            default:
                break;
        }
    }

}
  • 普通文本的处理

- (void)setTextWithSender:(UIButton *)sender OriginalText:(NSString *)strValue方法中 主要是对小数点的输入、小数位数、0开头问题等的处理,并且对text进行拼接和设置。

  • 功能按键的处理
  1. ABC
[tempTextView setInputView:nil];
[tempTextView reloadInputViews];
[self addBackKeyboardButton:@"More-Key"];

比较关键的就是在切换回系统的键盘后,找到了系统键盘More-Key这个键,就是看到的123。在上面添加了一个按钮,用于切换回我们的数字键盘。
因为我们项目中是禁用第三方键盘的,所以没有问题。如果你跟我一样使用的是搜狗输入法,那么因为不能获取到搜狗的按键view,就切不回来了。要是有朋友知道可以实现的话,还请可以指教一下。

  1. 删除
    由于textView不支持deleteBackward方法,所以麻烦点,要取到文本内容,截取到最后一个字符之前。或者deleteCharactersInRange删除最后一个字符。
  2. 确定、隐藏
    就是取消第一响应者。

TTTextField

/**
 *  随机数 还是 普通数字键盘
 */
@property (nonatomic, assign) KeyboardViewType keyboardViewType;
/**
 *  数字键盘 限制小数位数    默认2位
 */
@property (nonatomic, assign) NSUInteger dotvalue;
/**
 *  随机键盘 限制输入长度    默认不限制
 */
@property (nonatomic, assign) NSUInteger PWDlength;
@end

在设置type的时候,进行自定义键盘的设置。

-(void)setKeyboardViewType:(KeyboardViewType)keyboardViewType
{
    _keyboardViewType = keyboardViewType;
    if (keyboardViewType == KeyboardViewNum)
    {
        NumberKeyboardView *keyboard = [NumberKeyboardView shareKeyboardView];
        keyboard.frame = CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, kKeyboardHeight);
        self.inputView = keyboard;
    }
    else if (keyboardViewType == KeyboardViewRandomNum)
    {
        RanNumKeyboardView *ranKeyboard = [RanNumKeyboardView shareKeyboardView];
        ranKeyboard.frame = CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, kKeyboardHeight);
        // 设置随机数排列
        [ranKeyboard setRandomNumberText];
        self.inputView = ranKeyboard;
    }
}

通过设置控件的dotvalue,去keyboardView中进行小数位数的控制

-(void)setDotvalue:(NSUInteger)dotvalue
{
    _dotvalue = dotvalue;
    NumberKeyboardView *keyboard = [NumberKeyboardView shareKeyboardView];
    keyboard.dotvalue = dotvalue;
}

keyboardView的代理设置和textView设置就不一一贴代码了,一看就知道了。

关于键盘音效的问题,需要注意一下。

To enable a custom input or accessory view for input clicks, perform the following two steps:

  1. Adopt the UIInputViewAudioFeedback protocol in your input view class.
  1. Implement the enableInputClicksWhenVisible delegate method to return YES.

就是以下2点

@interface NumberKeyboardView : UIView
#pragma mark - UIInputViewAudioFeedback
- (BOOL)enableInputClicksWhenVisible
{
    return YES;
}

2. 随机数字键盘

也就是招商手机银行的数字键盘效果,参考了WAMaker/SelfDefineKeyboard的demo,只是他的block有点绕,我就简单的换成代理实现了。要是有什么不足的地方希望可以提醒我。

主要就是在控件设置键盘的时候调用方法设置按钮文字。当然在每次控件becomeFirstResponder的时候都重新设置一遍,做到随机的效果。

// 设置键盘文字
- (void)setRandomNumberText
{
    NSMutableArray *numbers = [NSMutableArray array];
    int startNum = 0;
    int length = 10;
    // 0-9 string
    for (int i = startNum; i < length; i++)
    {
        [numbers addObject:[NSString stringWithFormat:@"%d", i]];
    }
    // settitle
    for (int i = 0; i < self.arrKeys.count; i++)
    {
        UIButton *button = self.arrKeys[i];
        if (i == kKeyboardDelIndex) {
            [button setTitle:kKeyboardDeleteText forState:UIControlStateNormal];
            continue;
        } else if (i == kKeyboardDoneIndex) {
            [button setTitle:kKeyboardDoneText forState:UIControlStateNormal];
            continue;
        }
        // 0-9
        int index = arc4random() % numbers.count;
        // 换成索引
        [button setTitle:numbers[index] forState:UIControlStateNormal];
        // count减少
        [numbers removeObjectAtIndex:index];
    }
}

然后就是对PWDlength进行控制,感觉可能会遇到这种需求吧,默认是无限制的。

此处就不支持textView了,没什么使用场景。

demo地址,要是有什么不足之处,错误的地方请及时告知我,好好改进。

对于功能更加齐全的字母密码键盘 推荐

iFindTA/NHKeyboardPro
![[email protected]](http://upload-images.jianshu.io/upload_images/810907-5ef4bfab4027ebbf.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240 =375x667)

自定义数字键盘_第2张图片
1111


打算看看代码,把几种键盘用工具条切换加上去

你可能感兴趣的:(自定义数字键盘)