zoukankan      html  css  js  c++  java
  • 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
    
     

     使用:

    该封装使用了四张图片:

  • 相关阅读:
    k8s之ingress-nginx部署一直提示健康检查10254端口不通过问题就处理
    terminal Failed to fork(connot allocate memory)问题处理
    k8s进行与容器交互时报错:unable to upgrade connection: Unauthorized在k8s实现kubectl exec -it pod_ID sh出错解决
    kubernetes集群的安装异常汇---docker的驱动引擎
    centos7 部署镜像仓库 harbor步骤详解
    Linux下svn更新含有中文名称的库无法更新问题
    在ESXi使用esxcli命令強制关闭VM
    esxi主机用命令行强行关闭通过前端界面无法关闭的ESXI虚拟机
    Numpy_06 数组的文件输入输出 线性代数
    Numpy_05 数据处理
  • 原文地址:https://www.cnblogs.com/hualuoshuijia/p/10007452.html
Copyright © 2011-2022 走看看