NNValidationCodeView.m 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. //
  2. // NNValidationCodeView.m
  3. // NNValidationCodeView
  4. //
  5. // Created by edz on 2017/7/17.
  6. // Copyright © 2017年 刘朋坤. All rights reserved.
  7. //
  8. #import "NNValidationCodeView.h"
  9. #define NNCodeViewHeight self.frame.size.height
  10. @interface NNValidationCodeView()<UITextFieldDelegate>
  11. /// 存放 label 的数组
  12. @property (nonatomic, strong) NSMutableArray *labelArr;
  13. /// label 的数量
  14. @property (nonatomic, assign) NSInteger labelCount;
  15. /// label 之间的距离
  16. @property (nonatomic, assign) CGFloat labelDistance;
  17. @end
  18. @implementation NNValidationCodeView
  19. - (instancetype)initWithFrame:(CGRect)frame andLabelCount:(NSInteger)labelCount andLabelDistance:(CGFloat)labelDistance {
  20. self = [super initWithFrame:frame];
  21. if (self) {
  22. self.labelCount = labelCount;
  23. self.labelDistance = labelDistance;
  24. [self _initValue];
  25. [self youpaifinitUI];
  26. }
  27. return self;
  28. }
  29. - (void)_initValue{
  30. self.changedColor = [UIColor redColor];
  31. self.defaultColor = [UIColor blackColor];
  32. CGFloat labelWidth = self.codeTextField.frame.size.width / self.labelCount;
  33. CGFloat sideLength = labelWidth < NNCodeViewHeight ? labelWidth : NNCodeViewHeight;
  34. self.itemCornerRadius = sideLength / 2;
  35. self.itemBorderWidth = 1.0f;
  36. }
  37. - (void)youpaifinitUI {
  38. CGFloat labelX;
  39. CGFloat labelY = 0;
  40. CGFloat labelWidth = self.codeTextField.frame.size.width / self.labelCount;
  41. CGFloat sideLength = labelWidth < NNCodeViewHeight ? labelWidth : NNCodeViewHeight;
  42. for (int i = 0; i < self.labelCount; i++) {
  43. if (i == 0) {
  44. labelX = 0;
  45. } else {
  46. labelX = i * (sideLength + self.labelDistance);
  47. }
  48. UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(labelX, labelY, sideLength, sideLength)];
  49. [self addSubview:label];
  50. label.textAlignment = NSTextAlignmentCenter;
  51. label.layer.borderColor = [UIColor blackColor].CGColor;
  52. label.layer.borderWidth = self.itemBorderWidth;
  53. label.layer.cornerRadius = self.itemCornerRadius;
  54. [self.labelArr addObject:label];
  55. }
  56. }
  57. - (void)layoutSubviews{
  58. [super layoutSubviews];
  59. for (UILabel *lab in self.labelArr) {
  60. lab.layer.borderColor = self.defaultColor.CGColor;
  61. lab.layer.borderWidth = self.itemBorderWidth;
  62. lab.layer.cornerRadius = self.itemCornerRadius;
  63. }
  64. }
  65. - (void)textFieldDidChange:(UITextField *)textField {
  66. NSInteger i = textField.text.length;
  67. if (i == 0) {
  68. ((UILabel *)[self.labelArr objectAtIndex:0]).text = @"";
  69. ((UILabel *)[self.labelArr objectAtIndex:0]).layer.borderColor = _defaultColor.CGColor;
  70. } else {
  71. ((UILabel *)[self.labelArr objectAtIndex:i - 1]).text = [NSString stringWithFormat:@"%C", [textField.text characterAtIndex:i - 1]];
  72. ((UILabel *)[self.labelArr objectAtIndex:i - 1]).layer.borderColor = _changedColor.CGColor;
  73. ((UILabel *)[self.labelArr objectAtIndex:i - 1]).textColor = _changedColor;
  74. if (self.labelCount > i) {
  75. ((UILabel *)[self.labelArr objectAtIndex:i]).text = @"";
  76. ((UILabel *)[self.labelArr objectAtIndex:i]).layer.borderColor = _defaultColor.CGColor;
  77. }
  78. }
  79. if (self.codeBlock) {
  80. self.codeBlock(textField.text);
  81. }
  82. }
  83. - (void)emptyText{
  84. self.codeTextField.text = @"";
  85. for (UILabel *lab in self.labelArr) {
  86. lab.text = @"";
  87. lab.layer.borderColor = _defaultColor.CGColor;
  88. }
  89. }
  90. #pragma mark - UITextFieldDelegate
  91. - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
  92. if ([string isEqualToString:@"\n"]) {
  93. [textField resignFirstResponder];
  94. return NO;
  95. } else if (string.length == 0) {
  96. return YES;
  97. } else if (textField.text.length >= self.labelCount) {
  98. return NO;
  99. } else {
  100. return YES;
  101. }
  102. }
  103. #pragma mark - 懒加载
  104. - (NNTextField *)codeTextField {
  105. if (!_codeTextField) {
  106. _codeTextField = [[NNTextField alloc] initWithFrame:CGRectMake(0, 0, self.frame.size.width, NNCodeViewHeight)];
  107. _codeTextField.backgroundColor = [UIColor clearColor];
  108. _codeTextField.textColor = [UIColor clearColor];
  109. _codeTextField.tintColor = [UIColor clearColor];
  110. _codeTextField.delegate = self;
  111. _codeTextField.autocapitalizationType = UITextAutocapitalizationTypeNone;
  112. _codeTextField.keyboardType = UIKeyboardTypeNumberPad;
  113. _codeTextField.layer.borderColor = [[UIColor grayColor] CGColor];
  114. [_codeTextField addTarget:self action:@selector(textFieldDidChange:) forControlEvents:UIControlEventEditingChanged];
  115. [self addSubview:_codeTextField];
  116. }
  117. return _codeTextField;
  118. }
  119. #pragma mark - 懒加载
  120. - (NSMutableArray *)labelArr {
  121. if (!_labelArr) {
  122. _labelArr = [NSMutableArray array];
  123. }
  124. return _labelArr;
  125. }
  126. @end
  127. @implementation NNTextField
  128. /// 重写 UITextFiled 子类, 解决长按复制粘贴的问题
  129. - (BOOL)canPerformAction:(SEL)action withSender:(id)sender {
  130. UIMenuController *menuController = [UIMenuController sharedMenuController];
  131. if (menuController) {
  132. [UIMenuController sharedMenuController].menuVisible = NO;
  133. }
  134. return NO;
  135. }
  136. @end