项目中可能需要用到自定义的键盘。学习了下找到的2款数字键盘。自定义键盘可以通过设置UITextField的inputView实现。inputAccessoryView可以设置键盘上的工具条。
1. 带小数点常规数字键盘
布局就采用xib了,然后铺满了button,拉满了约束。总之是做到平分、等宽、等高就可以了。另外用代码设置了高亮的背景色。
然后把键盘的使用封装到了控件当中,TTTextField
、TTTextView
。使用控件就可以支持数字键盘。
点击的处理,通常会考虑让控件做为代理,然后根据点击的按钮进行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
进行拼接和设置。
- 功能按键的处理
- ABC
[tempTextView setInputView:nil];
[tempTextView reloadInputViews];
[self addBackKeyboardButton:@"More-Key"];
比较关键的就是在切换回系统的键盘后,找到了系统键盘More-Key这个键,就是看到的123。在上面添加了一个按钮,用于切换回我们的数字键盘。
因为我们项目中是禁用第三方键盘的,所以没有问题。如果你跟我一样使用的是搜狗输入法,那么因为不能获取到搜狗的按键view,就切不回来了。要是有朋友知道可以实现的话,还请可以指教一下。
- 删除
由于textView不支持deleteBackward
方法,所以麻烦点,要取到文本内容,截取到最后一个字符之前。或者deleteCharactersInRange
删除最后一个字符。 - 确定、隐藏
就是取消第一响应者。
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:
- Adopt the UIInputViewAudioFeedback protocol in your input view class.
- 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)
打算看看代码,把几种键盘用工具条切换加上去