1.本案例实现效果如图:
2.所需导入类文件及资源文件如图:
3.核心代码:
HTNumberKEyboardView.h
#import <UIKit/UIKit.h>
/** HTNumberKeyboardType自定义键盘类型
*
* 纯数字键盘:HTNumberKeyboardNumber
* 小数点键盘:HTNumberKeyboardDouble
* 身份证键盘:HTNumberKeyboardCertNo
*/
typedef NS_ENUM(NSInteger,HTNumberKeyboardType) {
HTNumberKeyboardNumber = 0,
HTNumberKeyboardDouble = 1,
HTNumberKeyboardCertNo = 2
};
@protocol HTNumberKeyboardDelegate;
@interface HTNumberKeyboardView : UIView
@property (nonatomic, weak) id<HTNumberKeyboardDelegate> delegate;
- (void)createdKeyboard;
@end
@protocol HTNumberKeyboardDelegate <NSObject>
/** 点击删除按钮 */
- (BOOL)textFieldShouldDelete:(HTNumberKeyboardView *)numberKeyboard;
/** 点击键盘输入相应数字及特殊字符 */
- (void)numberKeyboard:(HTNumberKeyboardView *)numberKeyboard replacementString:(NSString *)string;
/** 获取键盘类型 */
- (HTNumberKeyboardType)numberKeyboardType:(HTNumberKeyboardView *)numberKeyboard;
@end
HTNumberKeyboardView.m
#import "HTNumberKeyboardView.h"
#import "HTButton.h"
#import "UIColor+HTRGB.h"
@interface HTNumberKeyboardView ()
@property (nonatomic, strong) NSArray *keyboardTitle;
@end
@implementation HTNumberKeyboardView
- (instancetype)initWithFrame:(CGRect)frame {
if (self = [super initWithFrame:CGRectMake(0, HTHeight - 216, HTWidth, 216)]) {
self.backgroundColor = [UIColor colorWithRed:206/255.0 green:207/255.0 blue:208/255.0 alpha:1];
self.frame = CGRectMake(0, HTHeight - 216, HTWidth, 216);
}
return self;
}
- (void)createdKeyboard {
if ([self.delegate numberKeyboardType:self] == HTNumberKeyboardCertNo) {
self.keyboardTitle = [self keyboardTypeCertNoButtonTitle];
} else if ([self.delegate numberKeyboardType:self] == HTNumberKeyboardNumber){
self.keyboardTitle = [self keyboardTypeNumberButtonTitle];
}else if ([self.delegate numberKeyboardType:self] == HTNumberKeyboardDouble) {
self.keyboardTitle = [self keyboardTypeDoubleButtonTitle];
}
CGFloat buttonWidth = (HTWidth - 1.5) / 3;
CGFloat top = 0;
for (NSInteger index = 0; index < 11; index ++) {
HTButton * button = [[HTButton alloc] initWithFrame:(CGRect){(index % 3) * (buttonWidth+0.5),top+(index / 3) * 54,buttonWidth,54}];
button.tag = 1000 + index;
if ([self.delegate numberKeyboardType:self] == HTNumberKeyboardNumber && index == 9) {
button.button.enabled = NO;
[button.button setTitleColor:[UIColor colorWithRed:0 green:0 blue:0 alpha:0.1] forState:UIControlStateNormal];
[button.button setBackgroundImage:[HTButton imageColor:[UIColor colorWithHTRGB:0xE7E8E9]] forState:UIControlStateNormal];
}
[button setButtonTitle:self.keyboardTitle[index]];
[button.button addTarget:self action:@selector(keyButtonOnclick:) forControlEvents:UIControlEventTouchUpInside];
[self addSubview:button];
}
HTButton * button = [[HTButton alloc] initWithFrame:(CGRect){(11 % 3) * (buttonWidth+0.5),top+(11 / 3) * 54,buttonWidth,54}];
[button.button setImage:[UIImage imageNamed:@"keyboard_delete"] forState:UIControlStateNormal];
[button.button setBackgroundImage:[HTButton imageColor:[UIColor colorWithHTRGB:0xE7E8E9]] forState:UIControlStateNormal];
[button.button setBackgroundImage:[HTButton imageColor:[UIColor colorWithHTRGB:0xf7f7f7]] forState:UIControlStateHighlighted];
[button.button addTarget:self action:@selector(deleteButtonOnclick:) forControlEvents:UIControlEventTouchUpInside];
[self addSubview:button];
}
- (NSArray *)keyboardTypeCertNoButtonTitle {
return @[@"1",@"2",@"3",@"4",@"5",@"6",@"7",@"8",@"9",@"X",@"0",@""];
}
- (NSArray *)keyboardTypeDoubleButtonTitle {
return @[@"1",@"2",@"3",@"4",@"5",@"6",@"7",@"8",@"9",@".",@"0",@""];
}
- (NSArray *)keyboardTypeNumberButtonTitle {
return @[@"1",@"2",@"3",@"4",@"5",@"6",@"7",@"8",@"9",@"",@"0",@""];
}
- (void)keyButtonOnclick:(UIButton *) button {
if([self.delegate respondsToSelector:@selector(numberKeyboard:replacementString:)]) {
NSInteger index = [button.superview tag] - 1000;
if (self.keyboardTitle.count > index) {
[self.delegate numberKeyboard:self replacementString:self.keyboardTitle[index]];
}
}
}
- (void)deleteButtonOnclick:(UIButton *) button {
[self.delegate textFieldShouldDelete:self];
}
@end
HTTextField.h
#import <UIKit/UIKit.h>
#import "HTNumberKeyboardView.h"
/** HTNumberKeyboardType键盘类型
*
* 系统默认键盘:HTKeyboardTypeDefault
* 自定义键盘:HTKeyboardTypeNumber
*/
typedef NS_ENUM(NSInteger,HTKeyboardType) {
HTKeyboardTypeDefault = 0, // 系统默认键盘
HTKeyboardTypeNumber = 1 // 自定义键盘
};
@interface HTTextField : UITextField
@property (nonatomic, assign) HTNumberKeyboardType numberKeyboardType;
- (void)setKeyboardType:(HTKeyboardType)keyboardType;
@end
@interface UITextField (ExtentRange)
- (NSRange)selectedRange;
- (void)setSelectedRange:(NSRange)range;
@end
HTTextField.m
#import "HTTextField.h"
#import "HTNumberKeyboardView.h"
@implementation UITextField (ExtentRange)
- (NSRange)selectedRange {
UITextPosition* beginning = self.beginningOfDocument;
UITextRange* selectedRange = self.selectedTextRange;
UITextPosition* selectionStart = selectedRange.start;
UITextPosition* selectionEnd = selectedRange.end;
const NSInteger location = [self offsetFromPosition:beginning toPosition:selectionStart];
const NSInteger length = [self offsetFromPosition:selectionStart toPosition:selectionEnd];
return NSMakeRange(location, length);
}
- (void)setSelectedRange:(NSRange)range {
UITextPosition* beginning = self.beginningOfDocument;
UITextPosition* startPosition = [self positionFromPosition:beginning offset:range.location];
UITextPosition* endPosition = [self positionFromPosition:beginning offset:range.location + range.length];
UITextRange* selectionRange = [self textRangeFromPosition:startPosition toPosition:endPosition];
[self setSelectedTextRange:selectionRange];
}
@end
@interface HTTextField () <HTNumberKeyboardDelegate> {
HTNumberKeyboardView * numberKeyboard;
}
@end
@implementation HTTextField
- (void)awakeFromNib {
numberKeyboard = [[HTNumberKeyboardView alloc] init];
self.inputView = numberKeyboard;
numberKeyboard.delegate = self;
[numberKeyboard createdKeyboard];
}
- (instancetype)initWithFrame:(CGRect)frame {
if ( self = [super initWithFrame:frame]) {
[self awakeFromNib];
}
return self;
}
#pragma mark - BANumberKeyboardDelegate
- (BOOL)textFieldShouldDelete:(HTNumberKeyboardView *)numberKeyboard {
BOOL canEditor = YES;
if ([self.delegate respondsToSelector:@selector(textField:shouldChangeCharactersInRange:replacementString:)]) {
canEditor = [self.delegate textField:self shouldChangeCharactersInRange:self.selectedRange replacementString:@""];
}
if (canEditor) {
[self deleteBackward];
}
return canEditor;
}
- (void)numberKeyboard:(HTNumberKeyboardView *)numberKeyboard replacementString:(NSString *)string {
BOOL canEditor = YES;
if ([self.delegate respondsToSelector:@selector(textField:shouldChangeCharactersInRange:replacementString:)]) {
canEditor = [self.delegate textField:self shouldChangeCharactersInRange:self.selectedRange replacementString:string];
}
if (canEditor) {
[self replaceRange:self.selectedTextRange withText:string];
}
}
- (void)setKeyboardType:(HTKeyboardType)keyboardType {
switch (keyboardType) {
case HTKeyboardTypeDefault:
self.inputView = nil;
break;
case HTKeyboardTypeNumber:
self.inputView = numberKeyboard;
break;
default:
break;
}
}
- (void)setNumberKeyboardType:(HTNumberKeyboardType)numberKeyboardType {
_numberKeyboardType = numberKeyboardType;
numberKeyboard = [[HTNumberKeyboardView alloc] init];
self.inputView = numberKeyboard;
numberKeyboard.delegate = self;
[numberKeyboard createdKeyboard];
}
- (HTNumberKeyboardType)numberKeyboardType:(HTNumberKeyboardView *)numberKeyboard {
return self.numberKeyboardType;
}
@end
ViewController.m
#import "ViewController.h"
#import "HTTextField.h"
@interface ViewController ()
@property (nonatomic, strong) HTTextField *numberTextField;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
self.numberTextField = [[HTTextField alloc] initWithFrame:CGRectMake(50, 100, CGRectGetWidth(self.view.bounds) - 100, 30)];
self.numberTextField.placeholder = @"纯数字键盘";
self.numberTextField.backgroundColor = [UIColor greenColor];
self.numberTextField.textAlignment = NSTextAlignmentLeft;
self.numberTextField.returnKeyType = UIReturnKeyNext;
self.numberTextField.clearButtonMode = UITextFieldViewModeAlways;
[self.numberTextField setKeyboardType:HTKeyboardTypeNumber];
[self.numberTextField setNumberKeyboardType:HTNumberKeyboardNumber];
[self.view addSubview:self.numberTextField];
}
@end