OC仿支付宝输入UITextField输入车牌号

效果图,如果使用,出现任何问题请告知,或者下方留言,我好以及改正

.h文件:

#import <UIKit/UIKit.h>

@interface LicenseKeyBoardView : UIView
- (instancetype)initWithFrame:(CGRect)frame withTextField:(UITextField *)textField;
@end

.m文件

#import "LicenseKeyBoardView.h"
#define kWidth   [UIScreen mainScreen].bounds.size.width
#define kHeight  [UIScreen mainScreen].bounds.size.height
#define HEXCOLOR(hex, alp) [UIColor colorWithRed:((float)((hex & 0xFF0000) >> 16)) / 255.0 green:((float)((hex & 0xFF00) >> 8)) / 255.0 blue:((float)(hex & 0xFF)) / 255.0 alpha:alp]

#define LicenseLength  7 //最大的车牌号长度为7

@interface LicenseKeyBoardView()<UIGestureRecognizerDelegate>
{
    UIView *_backView1; //第一个view 省份
    UIView *_backView2; //第二个view 字母view
    UIButton *_btn;//abc和返回按键
}
@property (nonatomic, strong) NSArray *provinceArr; //省市简写数组
@property (nonatomic, strong) NSArray *letterArr; //车牌号码字母数字数组
@property(nonatomic,strong)UITextField *textField;
@end

@implementation LicenseKeyBoardView

- (NSArray *)provinceArr {
    if (!_provinceArr) {
        _provinceArr = @[@"京",@"津",@"渝",@"沪",@"冀",@"晋",@"辽",@"吉",@"黑",@"苏",@"浙",@"皖",@"闽",@"赣",@"鲁",@"豫",@"鄂",@"湘",@"粤",@"琼",@"川",@"贵",@"云",@"陕",@"甘",@"青",@"蒙",@"桂",@"宁",@"新",@"",@"藏",@"使",@"领",@"警",@"学",@"港",@"澳",@""];
    }
    return _provinceArr;
}

- (NSArray *)letterArr {
    if (!_letterArr) {
        _letterArr = @[@"1",@"2",@"3",@"4",@"5",@"6",@"7",@"8",@"9",@"0",@"Q",@"W",@"E",@"R",@"T",@"Y",@"U",@"I",@"O",@"P",@"A",@"S",@"D",@"F",@"G",@"H",@"J",@"K",@"L",@"",@"Z",@"X",@"C",@"V",@"B",@"N",@"M",@""];
    }
    return _letterArr;
}

- (instancetype)initWithFrame:(CGRect)frame withTextField:(UITextField *)textField{
    frame = CGRectMake(0, 0, kWidth, kHeight*0.33);
    if (self = [super initWithFrame:frame]) {
        self.backgroundColor = [UIColor redColor];
        self.textField = textField;
        //注册一个通知,后面会用到,来监听abc字母键
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textFAction:) name:@"abc" object:nil];
        //添加一个手势,点击键盘外面收回键盘
        UITapGestureRecognizer *recognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(hiddenView)];
        recognizer.delegate = self;
        [self addGestureRecognizer:recognizer];
        [self setupUI];
    }
    return self;
}

- (void)setupUI {
    CGSize size = self.frame.size;
    
    _backView1 = [[UIView alloc] initWithFrame:self.bounds];
    _backView1.backgroundColor = HEXCOLOR(0xd2d5da, 1);
    _backView1.hidden = NO;
    
    _backView2 = [[UIView alloc] initWithFrame:self.bounds];
    _backView2.hidden = YES;
    _backView2.backgroundColor = HEXCOLOR(0xd2d5da, 1);
    
    [self addSubview:_backView1];
    [self addSubview:_backView2];
    
    int row = 4;
    int column = 10;
    CGFloat btnY = 4;
    CGFloat btnX = 2;
    CGFloat maginR = 5;
    CGFloat maginC = 10;
    CGFloat btnW = (size.width - maginR * (column -1) - 2 * btnX)/column;
    CGFloat btnH = (_backView1.frame.size.height - maginC * (row - 1) - 6) / row;
    CGFloat m = 12;
    CGFloat w = (size.width - 24 - 7 * btnW - 6 * maginR - 2 * btnX)/2;
    CGFloat mw = (size.width - 8 * maginR - 9 * btnW - 2 * btnX) / 2;
    NSLog(@"LY >> count - %zd", self.provinceArr.count);
    for (int i = 0; i < self.provinceArr.count; i++) {
        UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];
        if (i / column == 3) {
            if (i == 30) {
                btn.frame = CGRectMake(btnX, btnY + 3 * (btnH + maginC), w, btnH);
                [btn setBackgroundImage:[UIImage imageNamed:@"key_abc"] forState:UIControlStateNormal];
                btn.enabled = NO;
                _btn = btn;
            }else if (i == 38) {
                btn.frame = CGRectMake(6 * (btnW + maginR) + btnW + w + m + m, btnY + 3 * (btnH + maginC), w, btnH);
                [btn setBackgroundImage:[UIImage imageNamed:@"key_over"] forState:UIControlStateNormal];
            }else {
                btn.frame = CGRectMake((i % column - 1)*(btnW + maginR) + w + m + btnX, btnY + 3 * (btnH + maginC), btnW, btnH);
                [btn setBackgroundImage:[UIImage imageNamed:@"key_number"] forState:UIControlStateNormal];
            }
        }else {
            btn.frame = CGRectMake(btnW * (i % column) + i % column * maginR + btnX, btnY + i/column * (btnH + maginC), btnW, btnH);
            [btn setBackgroundImage:[UIImage imageNamed:@"key_number"] forState:UIControlStateNormal];
        }
        [btn setTitleColor:HEXCOLOR(0x23262F, 1) forState:UIControlStateNormal];
        [btn setTitle:self.provinceArr[i] forState:UIControlStateNormal];
        btn.layer.cornerRadius = 3;
        btn.layer.masksToBounds = YES;
        btn.tag = i;
        [btn addTarget:self action:@selector(btn1Click:) forControlEvents:UIControlEventTouchUpInside];
        [_backView1 addSubview:btn];
    }
    
    for (int i = 0; i < self.letterArr.count; i++) {
        
        UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];
        
        if (i >= 20 && i < 29) {
            
            btn.frame = CGRectMake(btnX + mw + (btnW + maginR) * (i % column), btnY + 2 * (btnH + maginC), btnW, btnH);
            [btn setBackgroundImage:[UIImage imageNamed:@"key_number"] forState:UIControlStateNormal];
            
        }else if (i >= 29) {
            if (i == 29) {
                btn.frame = CGRectMake(btnX, btnY + 3 * (btnH + maginC), w, btnH);
                [btn setBackgroundImage:[UIImage imageNamed:@"key_back"] forState:UIControlStateNormal];
            }else if (i == 37) {
                btn.frame = CGRectMake(6 * (btnW + maginR) + btnW + w + m + m + btnX, btnY + 3 * (btnH + maginC), w, btnH);
                [btn setBackgroundImage:[UIImage imageNamed:@"key_over"] forState:UIControlStateNormal];
            }else {
                btn.frame = CGRectMake((i % column)*(btnW + maginR) + w + m + btnX, btnY + 3 * (btnH + maginC), btnW, btnH);
                [btn setBackgroundImage:[UIImage imageNamed:@"key_number"] forState:UIControlStateNormal];
            }
        }else {
            btn.frame = CGRectMake(btnW * (i % column) + i % column * maginR + btnX, btnY + i/column * (btnH + maginC), btnW, btnH);
            [btn setBackgroundImage:[UIImage imageNamed:@"key_number"] forState:UIControlStateNormal];
        }
        [btn setTitleColor:HEXCOLOR(0x23262F, 1) forState:UIControlStateNormal];
        [btn setTitle:self.letterArr[i] forState:UIControlStateNormal];
        
        btn.layer.cornerRadius = 3;
        btn.layer.masksToBounds = YES;
        btn.tag = i;
        [btn addTarget:self action:@selector(btn2Click:) forControlEvents:UIControlEventTouchUpInside];
        [_backView2 addSubview:btn];
    }
}

- (void)btn1Click:(UIButton *)sender {
    
    // NSLog(@" >>> provinceArr: - %@ -- tag - %zd", self.provinceArr[sender.tag],sender.tag);
    _btn.enabled = YES;
    if (sender.tag == 30) {
        //  NSLog(@"点击了abc键");
        if (_backView2.hidden) {
            // NSLog(@"_backView2 隐藏了");
            _backView1.hidden = YES;
            _backView2.hidden = NO;
        }else {
            sender.enabled = NO;
        }
        
    }else if (sender.tag == 38){
        // 点击删除键
        if (_backView2.hidden) {
            [self deleteBtnClick];
        }
    }else {
        //点击汉字字母或者数字键
        _backView1.hidden = YES;
        _backView2.hidden = NO;
        if(self.textField.text.length < LicenseLength){
            [self.textField insertText:self.provinceArr[sender.tag]];
        }
    }
}

- (void)btn2Click:(UIButton *)sender {
    
    if (sender.tag == 29) {
        // NSLog(@"点击了abc键");
        _backView1.hidden = NO;
        _backView2.hidden = YES;
        
    }else if (sender.tag == 37) {
        //  NSLog(@"点击了删除键");
        
        [self deleteBtnClick];
        
    }else {
        if(self.textField.text.length < LicenseLength){
            [self.textField insertText:self.letterArr[sender.tag]];
        }
        
    }
}
- (void)deleteBtnClick{
    [self.textField deleteBackward];
    
    if (self.textField.text.length == 1) {
        //删除完了,没有字符可以删除了,切换显示的view
        [self deleteEnd];
    }
}
/**
 如果textfield删除完毕,则显示省份
 */
- (void)deleteEnd {
    _backView1.hidden = NO;
    _backView2.hidden = YES;
}

//通知的监听方法
- (void)textFAction:(NSNotification *)notification {
    
    // NSLog(@" >> info -- %@", notification.userInfo);
    NSString *str = notification.userInfo[@"text"];
    if (str.length == 0) {
        _btn.enabled = NO;
    }else if (str.length == 7) {
        [self hiddenView];
    }else {
        _backView1.hidden = YES;
        _backView2.hidden = NO;
        _btn.enabled = YES;
    }
}

//初次弹出键盘时
- (void)showWithString:(NSString *)string {
    //  NSLog(@" >> string -- %@", string);
    
    _backView1.hidden = YES;
    _backView2.hidden = NO;
    _btn.enabled = YES;
}

//收回键盘
- (void)hiddenView {
    
    CGSize size = [UIScreen mainScreen].bounds.size;
    [UIView animateWithDuration:0.3 animations:^{
        CGRect frame = self->_backView1.frame;
        frame.origin.y = size.height;
        self->_backView1.frame = frame;
    } completion:^(BOOL finished) {
        [self removeFromSuperview];
    }];
    
    [UIView animateWithDuration:0.3 animations:^{
        CGRect frame = self->_backView2.frame;
        frame.origin.y = size.height;
        self->_backView2.frame = frame;
    } completion:^(BOOL finished) {
        [self removeFromSuperview];
    }];
}

//手势的代理方法
#pragma mark >> UIGestureRecognizerDelegate
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
    if ([touch.view isDescendantOfView:_backView1] ||
        [touch.view isDescendantOfView:_backView2] ) {
        
        return NO;
    }
    return YES;
}

//销毁通知
- (void)dealloc {
    
    [[NSNotificationCenter defaultCenter] removeObserver:self];
}

@end
 

 使用:

该封装使用了四张图片:

原文地址:https://www.cnblogs.com/hualuoshuijia/p/10007452.html