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

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地址

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值