WXHTextBoxField.m 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187
  1. //
  2. // WXHTextBoxField.m
  3. // xh_textfield
  4. //
  5. // Created by 路 on 2019/4/12.
  6. // Copyright © 2019年 路. All rights reserved.
  7. //
  8. #import "WXHTextBoxField.h"
  9. #import "WXHTextBox.h"
  10. @interface WXHTextBoxField ()
  11. /// 设置当前正在编辑的位置
  12. @property (assign ,nonatomic) NSInteger editingIndex;
  13. @end
  14. @implementation WXHTextBoxField {
  15. NSArray <WXHTextBox *>*_items;
  16. }
  17. @synthesize secureTextEntry = _secureTextEntry;
  18. #pragma mark -
  19. - (void)_reloadData {
  20. _items = nil;
  21. for (WXHTextBox *subview in self.subviews) {
  22. if ([subview isKindOfClass:[WXHTextBox class]]) {
  23. [subview destroy];
  24. [subview removeFromSuperview];
  25. }
  26. }
  27. // 计算 item size
  28. CGSize itemSize = CGSizeZero;
  29. itemSize.height = self.frame.size.height - _insets.top - _insets.bottom;
  30. itemSize.width = itemSize.height;
  31. // 计算间距
  32. CGFloat spacing = 0;
  33. if (_numberOfItem > 1) {
  34. spacing = (self.frame.size.width - _insets.left - _insets.right - itemSize.width * _numberOfItem) / (_numberOfItem - 1);
  35. }
  36. NSMutableArray *items = [NSMutableArray arrayWithCapacity:_numberOfItem];
  37. for (int i = 0; i < _numberOfItem; i ++) {
  38. WXHTextBox *item = [[WXHTextBox alloc] init];
  39. item.normalColor = self.normalColor;
  40. item.activeColor = self.activeColor;
  41. item.normalTextColor = self.normalTextColor;
  42. item.activeTextColor = self.activeTextColor;
  43. item.frame = ({
  44. CGRect frame = item.frame;
  45. frame.origin.x = _insets.left + (itemSize.width + spacing) * i;
  46. frame.origin.y = _insets.top;
  47. frame.size = itemSize;
  48. frame;
  49. });
  50. item.active = [self isFirstResponder] && (i == _editingIndex);
  51. [self addSubview:item];
  52. item.backgroundColor = [UIColor whiteColor];
  53. [items addObject:item];
  54. }
  55. _items = [items copy];
  56. }
  57. - (void)_resetAllItem {
  58. for (WXHTextBox *object in _items) object.active = NO;
  59. }
  60. #pragma mark - setter
  61. - (void)setInsets:(UIEdgeInsets)insets {
  62. _insets = insets;
  63. [self _reloadData];
  64. }
  65. - (void)setNumberOfItem:(NSInteger)numberOfItem {
  66. _numberOfItem = numberOfItem;
  67. _editingIndex = 0;
  68. [self _reloadData];
  69. }
  70. - (void)setEditingIndex:(NSInteger)editingIndex {
  71. _editingIndex = editingIndex;
  72. if (_editingIndex >= 0 && _editingIndex < _items.count) {
  73. for (int i = 0; i < _items.count; i ++) {
  74. _items[i].active = (i == _editingIndex);
  75. }
  76. } else {
  77. [self _resetAllItem];
  78. }
  79. }
  80. #pragma mark - getter
  81. - (NSString *)text; {
  82. NSMutableString *string = [[NSMutableString alloc] init];
  83. for (WXHTextBox *object in _items) {
  84. NSString *c = object.label.text;
  85. if (c.length > 0) {
  86. [string appendString:[c stringByReplacingOccurrencesOfString:@" " withString:@""]];
  87. }
  88. }
  89. return [string copy];
  90. }
  91. #pragma mark - overwrite
  92. - (BOOL)resignFirstResponder {
  93. [self _resetAllItem];
  94. return [super resignFirstResponder];
  95. }
  96. - (BOOL)canBecomeFirstResponder {
  97. return YES;
  98. }
  99. - (void)layoutSubviews {
  100. [super layoutSubviews];
  101. [self _reloadData];
  102. }
  103. #pragma mark - key input
  104. - (BOOL)hasText; {
  105. return YES;
  106. }
  107. - (void)insertText:(NSString *)text; {
  108. NSInteger editingIndex = -1;
  109. for (int i = 0; i < _items.count; i ++) {
  110. WXHTextBox *object = _items[i];
  111. if (object.active) {
  112. editingIndex = i; break;
  113. }
  114. }
  115. if (editingIndex == -1) {
  116. return;
  117. }
  118. WXHTextBox *editingItem = _items[editingIndex];
  119. editingItem.label.text = text;
  120. editingItem.active = NO;
  121. if ([_delegate respondsToSelector:@selector(textField:textDidChange:)]) {
  122. [_delegate textField:self textDidChange:self.text];
  123. }
  124. NSInteger nextIndex = editingIndex + 1;
  125. if (nextIndex < _items.count) {
  126. self.editingIndex = nextIndex;
  127. } else {
  128. if ([_delegate respondsToSelector:@selector(textField:didFinish:)]) {
  129. [_delegate textField:self didFinish:self.text];
  130. }
  131. }
  132. }
  133. - (void)deleteBackward; {
  134. if (_editingIndex > 0) {
  135. // 判断如果当前编辑的位置是最后一位并且最后一位已有内容,只做清空内容处理,不做退格处理
  136. UILabel *label = _items[_editingIndex].label;
  137. if (label.text.length > 0 && _editingIndex == _items.count - 1) {
  138. label.text = nil;
  139. } else {
  140. self.editingIndex = _editingIndex - 1;
  141. _items[_editingIndex].label.text = nil;
  142. }
  143. }
  144. if ([_delegate respondsToSelector:@selector(textField:textDidChange:)]) {
  145. [_delegate textField:self textDidChange:self.text];
  146. }
  147. }
  148. - (UIKeyboardType)keyboardType {
  149. return UIKeyboardTypeNumberPad;
  150. }
  151. #pragma mark -
  152. - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
  153. [self becomeFirstResponder];
  154. self.editingIndex = _editingIndex;
  155. }
  156. - (void)dealloc {
  157. for (WXHTextBox *object in _items) {
  158. [object destroy];
  159. }
  160. }
  161. @end