首页 > 学院 > 开发设计 > 正文

自定义键盘(纯数字键盘、小数点键盘、身份证键盘)

2019-11-07 22:52:24
字体:
来源:转载
供稿:网友

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

demo地址


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表