上周公司项目 要求做支付充值 弹出的数字键盘 可以跟支付宝一样,系统自带的外观不好看,要想做到像支付宝那样,想了想也就自己自定义做了。
做完后发现也不难。
UITextField 有一个inputView的属性 这个属性 就是弹出键盘的View,将自定义的键盘的View赋值给inputView 实现了 弹出自定义键盘。
实现的步骤如下:
用一个UIView 搭建键盘 UI
// CZKeyBoardView.h
//
// Created by location on 16/9/20.
#import <UIKit/UIKit.h>
@class CZKeyBoardView;
typedef enum {
CZKeyBoardBtnTypeHid = 11,//隐藏键盘
CZKeyBoardBtnTypeDelete = 12,//删除
CZKeyBoardBtnTypeSure = 13//确定
}CZKeyBoardBtnType;
@protocol CZKeyBoardViewDelegate <NSObject>
- (void)keyBoardView:(CZKeyBoardView *)keyBoardView didClickSureBtn:(UIButton *)btn;
@end
@interface CZKeyBoardView : UIView
@property (nonatomic,strong) UITextField *textF;
+ (instancetype)shareKeyBoard;
@property (nonatomic,weak) id<CZKeyBoardViewDelegate>delegate;
界面实现比较简单,在点m文件中,记得声明一个UITextField的属性
@property (nonatomic, weak) UITextField<UITextInput> *textInput;
监听通知 UITextFieldTextDidBeginEditingNotification 实现该通知的方法
- (void)inputTextAction:(NSNotification *)notifacation
{
self.textInput = notifacation.object;
}
该通知实现 我的理解是 替换系统的输入 换成自定义的输入
接下来就是实现相应的输入文本 添加 ,删除 ,确定
通过查看UITextInput 的协议文件 我们发现 它有如下几个属性
通过了解得知,
- (void)insertText:(NSString *)text;
是将文本不断添加插入
- (void)deleteBackward;
是将文本从后往前按照长度为1删除
所以实现相应点击按钮的点击事件
点击数字实现文本添加:点击删除实现文本删除
代码如下:
if (btn.titleLabel.text.length == 1) {
[self.textInput insertText:btn.titleLabel.text];
}
switch (btn.tag) {
case CZKeyBoardBtnTypeHid:
[self.textInput endEditing:YES];
break;
case CZKeyBoardBtnTypeDelete:
[self.textInput deleteBackward];
break;
case CZKeyBoardBtnTypeSure:
if ([self.delegate respondsToSelector:@selector(keyBoardView:didClickSureBtn:)]) {
[self.delegate keyBoardView:self didClickSureBtn:btn];
}
[self.textInput endEditing:YES];
break;
default:
break;
}
这样自定义的数字键盘就做好了