123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157 |
- //
- // NNValidationCodeView.m
- // NNValidationCodeView
- //
- // Created by edz on 2017/7/17.
- // Copyright © 2017年 刘朋坤. All rights reserved.
- //
- #import "NNValidationCodeView.h"
- #define NNCodeViewHeight self.frame.size.height
- @interface NNValidationCodeView()<UITextFieldDelegate>
- /// 存放 label 的数组
- @property (nonatomic, strong) NSMutableArray *labelArr;
- /// label 的数量
- @property (nonatomic, assign) NSInteger labelCount;
- /// label 之间的距离
- @property (nonatomic, assign) CGFloat labelDistance;
- @end
- @implementation NNValidationCodeView
- - (instancetype)initWithFrame:(CGRect)frame andLabelCount:(NSInteger)labelCount andLabelDistance:(CGFloat)labelDistance {
-
- self = [super initWithFrame:frame];
- if (self) {
- self.labelCount = labelCount;
- self.labelDistance = labelDistance;
-
- [self _initValue];
- [self youpaifinitUI];
- }
- return self;
- }
- - (void)_initValue{
- self.changedColor = [UIColor redColor];
- self.defaultColor = [UIColor blackColor];
-
- CGFloat labelWidth = self.codeTextField.frame.size.width / self.labelCount;
- CGFloat sideLength = labelWidth < NNCodeViewHeight ? labelWidth : NNCodeViewHeight;
- self.itemCornerRadius = sideLength / 2;
- self.itemBorderWidth = 1.0f;
- }
- - (void)youpaifinitUI {
- CGFloat labelX;
- CGFloat labelY = 0;
- CGFloat labelWidth = self.codeTextField.frame.size.width / self.labelCount;
- CGFloat sideLength = labelWidth < NNCodeViewHeight ? labelWidth : NNCodeViewHeight;
- for (int i = 0; i < self.labelCount; i++) {
- if (i == 0) {
- labelX = 0;
- } else {
- labelX = i * (sideLength + self.labelDistance);
- }
- UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(labelX, labelY, sideLength, sideLength)];
- [self addSubview:label];
- label.textAlignment = NSTextAlignmentCenter;
- label.layer.borderColor = [UIColor blackColor].CGColor;
- label.layer.borderWidth = self.itemBorderWidth;
- label.layer.cornerRadius = self.itemCornerRadius;
- [self.labelArr addObject:label];
- }
- }
- - (void)layoutSubviews{
- [super layoutSubviews];
- for (UILabel *lab in self.labelArr) {
- lab.layer.borderColor = self.defaultColor.CGColor;
- lab.layer.borderWidth = self.itemBorderWidth;
- lab.layer.cornerRadius = self.itemCornerRadius;
- }
- }
- - (void)textFieldDidChange:(UITextField *)textField {
- NSInteger i = textField.text.length;
- if (i == 0) {
- ((UILabel *)[self.labelArr objectAtIndex:0]).text = @"";
- ((UILabel *)[self.labelArr objectAtIndex:0]).layer.borderColor = _defaultColor.CGColor;
- } else {
- ((UILabel *)[self.labelArr objectAtIndex:i - 1]).text = [NSString stringWithFormat:@"%C", [textField.text characterAtIndex:i - 1]];
- ((UILabel *)[self.labelArr objectAtIndex:i - 1]).layer.borderColor = _changedColor.CGColor;
- ((UILabel *)[self.labelArr objectAtIndex:i - 1]).textColor = _changedColor;
- if (self.labelCount > i) {
- ((UILabel *)[self.labelArr objectAtIndex:i]).text = @"";
- ((UILabel *)[self.labelArr objectAtIndex:i]).layer.borderColor = _defaultColor.CGColor;
- }
- }
- if (self.codeBlock) {
- self.codeBlock(textField.text);
- }
- }
- - (void)emptyText{
- self.codeTextField.text = @"";
- for (UILabel *lab in self.labelArr) {
- lab.text = @"";
- lab.layer.borderColor = _defaultColor.CGColor;
- }
- }
- #pragma mark - UITextFieldDelegate
- - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
- if ([string isEqualToString:@"\n"]) {
- [textField resignFirstResponder];
- return NO;
- } else if (string.length == 0) {
- return YES;
- } else if (textField.text.length >= self.labelCount) {
- return NO;
- } else {
- return YES;
- }
- }
- #pragma mark - 懒加载
- - (NNTextField *)codeTextField {
- if (!_codeTextField) {
- _codeTextField = [[NNTextField alloc] initWithFrame:CGRectMake(0, 0, self.frame.size.width, NNCodeViewHeight)];
- _codeTextField.backgroundColor = [UIColor clearColor];
- _codeTextField.textColor = [UIColor clearColor];
- _codeTextField.tintColor = [UIColor clearColor];
- _codeTextField.delegate = self;
- _codeTextField.autocapitalizationType = UITextAutocapitalizationTypeNone;
- _codeTextField.keyboardType = UIKeyboardTypeNumberPad;
- _codeTextField.layer.borderColor = [[UIColor grayColor] CGColor];
- [_codeTextField addTarget:self action:@selector(textFieldDidChange:) forControlEvents:UIControlEventEditingChanged];
- [self addSubview:_codeTextField];
- }
- return _codeTextField;
- }
- #pragma mark - 懒加载
- - (NSMutableArray *)labelArr {
- if (!_labelArr) {
- _labelArr = [NSMutableArray array];
- }
- return _labelArr;
- }
- @end
- @implementation NNTextField
- /// 重写 UITextFiled 子类, 解决长按复制粘贴的问题
- - (BOOL)canPerformAction:(SEL)action withSender:(id)sender {
- UIMenuController *menuController = [UIMenuController sharedMenuController];
- if (menuController) {
- [UIMenuController sharedMenuController].menuVisible = NO;
- }
- return NO;
- }
- @end
|