// // LoginInputItemView.m // YuMi // // Created by P on 2025/3/14. // #import "LoginInputItemView.h" static NSString *const kAreaCodePrefix = @"+"; @interface LoginInputItemView() @property(nonatomic, copy) NSString *placeholderText; @property(nonatomic, assign) LoginInputType inputType; @property(nonatomic, strong) UITextField *inputTextField; @property(nonatomic, strong) UIButton *rightActionButton; @property(nonatomic, strong) UIButton *areaCodeButton; @property(nonatomic, strong) UILabel *areaLabel; @property(nonatomic, strong) UIButton *verificationCodeButton; @property(nonatomic, assign) NSInteger verificationCountDown; @property(nonatomic, strong) NSTimer *verificationTimer; @end @implementation LoginInputItemView - (void)deallo { _verificationTimer = nil; } - (instancetype)initWithType:(LoginInputType)type { if (self = [super init]) { self.backgroundColor = [UIColor whiteColor]; [self setCornerRadius:23]; [self addSubview:self.inputTextField]; self.inputType = type; } return self; } - (void)setInputType:(LoginInputType)inputType { _inputType = inputType; switch (inputType) { case LoginInputType_id: { [self updatePlaceholder:YMLocalizedString(@"20.20.51_text_3")]; self.inputTextField.keyboardType = UIKeyboardTypeNumberPad; } break; case LoginInputType_email: { [self updatePlaceholder:YMLocalizedString(@"20.20.51_text_4")]; self.inputTextField.keyboardType = UIKeyboardTypeEmailAddress; } break; case LoginInputType_phoneNum: { [self updatePlaceholder:YMLocalizedString(@"XPMineResetLoginPwdViewController1")]; self.inputTextField.keyboardType = UIKeyboardTypePhonePad; } break; case LoginInputType_password: { [self updatePlaceholder:YMLocalizedString(@"XPLoginPwdViewController3")]; self.inputTextField.keyboardType = UIKeyboardTypeDefault; self.inputTextField.secureTextEntry = YES; } break; case LoginInputType_createPassword: [self updatePlaceholder:YMLocalizedString(@"20.20.51_text_11")]; self.inputTextField.keyboardType = UIKeyboardTypeDefault; self.inputTextField.secureTextEntry = YES; break; case LoginInputType_verificationCode: { [self updatePlaceholder:YMLocalizedString(@"20.20.51_text_7")]; self.inputTextField.keyboardType = UIKeyboardTypeDefault; } break; case LoginInputType_confirmPassword: { [self updatePlaceholder:YMLocalizedString(@"20.20.51_text_11")]; self.inputTextField.keyboardType = UIKeyboardTypeDefault; } break; default: break; } [self updateInputLayout]; } - (void)updatePlaceholder:(NSString *)placeholder { self.inputTextField.attributedPlaceholder = [[NSAttributedString alloc] initWithString:placeholder attributes:@{ NSFontAttributeName: kFontRegular(14), NSForegroundColorAttributeName: UIColorFromRGB(0xafb1b3) }]; } - (void)updateInputLayout { switch (self.inputType) { case LoginInputType_id: case LoginInputType_email: case LoginInputType_createPassword: case LoginInputType_confirmPassword: { [self.inputTextField mas_makeConstraints:^(MASConstraintMaker *make) { make.edges.mas_equalTo(self).insets(UIEdgeInsetsMake(12, 20, 12, 20)); }]; } break; case LoginInputType_password: { [self insertRightActionButton]; [self.inputTextField mas_makeConstraints:^(MASConstraintMaker *make) { make.leading.mas_equalTo(self).offset(20); make.bottom.top.mas_equalTo(self).inset(12); make.trailing .mas_equalTo(self.rightActionButton.mas_leading) .offset(-20); }]; } break; case LoginInputType_phoneNum: { [self insertAreaCodeButton]; [self.inputTextField mas_makeConstraints:^(MASConstraintMaker *make) { make.leading.mas_equalTo(self.areaCodeButton.mas_trailing).offset(8); make.bottom.top.mas_equalTo(self).inset(12); make.trailing.mas_equalTo(self).offset(-12); }]; } break; case LoginInputType_verificationCode: { [self insertVerificationCodeButton]; [self.inputTextField mas_makeConstraints:^(MASConstraintMaker *make) { make.leading.mas_equalTo(self).offset(20); make.bottom.top.mas_equalTo(self).inset(12); make.trailing .mas_equalTo(self.verificationCodeButton.mas_leading) .offset(-20); }]; } break; default: break; } } - (void)insertAreaCodeButton { [self addSubview:self.areaCodeButton]; [self.areaCodeButton mas_makeConstraints:^(MASConstraintMaker *make) { make.centerY.mas_equalTo(self); make.leading.mas_equalTo(13); make.height.mas_equalTo(20); make.width.mas_equalTo(60); }]; UIImageView *image = [[UIImageView alloc] initWithImage:kImage(@"login_page_area_arrow")]; image.contentMode = UIViewContentModeScaleAspectFit; [self.areaCodeButton addSubview:image]; [self.areaCodeButton addSubview:self.areaLabel]; [self.areaLabel mas_makeConstraints:^(MASConstraintMaker *make) { make.centerY.mas_equalTo(self.areaCodeButton); make.leading.mas_equalTo(self.areaCodeButton); make.height.mas_equalTo(20); }]; [image mas_makeConstraints:^(MASConstraintMaker *make) { make.centerY.mas_equalTo(self.areaCodeButton); make.leading.mas_equalTo(self.areaLabel.mas_trailing).offset(4); make.size.mas_equalTo(CGSizeMake(10, 5)); }]; } - (void)insertVerificationCodeButton { [self addSubview:self.verificationCodeButton]; [self.verificationCodeButton mas_makeConstraints:^(MASConstraintMaker *make) { make.centerY.mas_equalTo(self); make.trailing.mas_equalTo(-23); make.height.mas_equalTo(20); if (isMSRTL()) { make.width.mas_equalTo(80); } else { make.width.mas_equalTo(60); } }]; } - (void)insertRightActionButton { [self addSubview:self.rightActionButton]; [self.rightActionButton mas_makeConstraints:^(MASConstraintMaker *make) { make.centerY.mas_equalTo(self); make.trailing.mas_equalTo(-20); make.height.mas_equalTo(24); make.width.mas_equalTo(24); }]; } - (NSString *)inputContent { return self.inputTextField.text; } - (void)updateAreaCode:(NSString *)code { self.areaLabel.text = [NSString stringWithFormat:@"%@%@", kAreaCodePrefix, code]; // if (_areaCodeButton) { // [self.areaCodeButton setTitle:[NSString stringWithFormat:@"%@%@", kAreaCodePrefix, code] // forState:UIControlStateNormal]; // } } - (NSString *)loadAreaCode { NSString *code = [self.areaLabel text]; if ([code hasPrefix:kAreaCodePrefix]) { [code stringByReplacingOccurrencesOfString:kAreaCodePrefix withString:@""]; } return code; } - (void)startVerificationCountDown { self.verificationCountDown = 60; @kWeakify(self); self.verificationTimer = [NSTimer scheduledTimerWithTimeInterval:1 repeats:YES block:^(NSTimer * _Nonnull timer) { @kStrongify(self); [self updateVerificationCountDown]; }]; } - (void)endVerificationCountDown { if (_verificationTimer) { [self.verificationTimer invalidate]; } self.verificationCodeButton.enabled = YES; } - (void)updateBGColor:(UIColor *)color { self.backgroundColor = color; } - (void)displayKeyboard { [self.inputTextField becomeFirstResponder]; } #pragma mark - - (void)handleVerificationCountDown { if (_handleItemAction) { self.handleItemAction(self.inputType); } } - (void)updateVerificationCountDown { [self.verificationCodeButton setTitle:[NSString stringWithFormat:YMLocalizedString(@"20.20.51_text_9"), @(self.verificationCountDown)] forState:UIControlStateDisabled]; self.verificationCodeButton.enabled = NO; self.verificationCountDown -= 1; if (self.verificationCountDown < 0) { [self endVerificationCountDown]; } } #pragma mark - - (void)didTapAreaButton { if (_handleItemAction) { self.handleItemAction(self.inputType); } } - (void)didTapVerificationButton { if (_handleItemAction) { self.handleItemAction(self.inputType); } } - (void)didTapRightActionButton { self.rightActionButton.selected = !self.rightActionButton.isSelected; self.inputTextField.secureTextEntry = !self.rightActionButton.selected; } #pragma mark - UITextFieldDelegate - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { NSString *updatedText = [textField.text stringByReplacingCharactersInRange:range withString:string]; NSLog(@"当前文本:%@", updatedText); switch (self.inputType) { case LoginInputType_id: case LoginInputType_email: case LoginInputType_phoneNum: if (_handleFirstInputContentUpdate) { self.handleFirstInputContentUpdate(updatedText); } break; case LoginInputType_password: case LoginInputType_verificationCode: if (_handleSecondInputContentUpdate) { self.handleSecondInputContentUpdate(updatedText); } break; case LoginInputType_confirmPassword: if (_handleThirdInputContentUpdate) { self.handleThirdInputContentUpdate(updatedText); } break; default: break; } return YES; } #pragma mark - - (UITextField *)inputTextField { if (!_inputTextField) { _inputTextField = [[UITextField alloc] init]; _inputTextField.font = kFontMedium(14); _inputTextField.textColor = UIColorFromRGB(0x313131); _inputTextField.delegate = self; } return _inputTextField; } - (UILabel *)areaLabel { if (!_areaLabel) { _areaLabel = [UILabel labelInitWithText:[NSString getCountryCode] font:kFontMedium(14) textColor:UIColorFromRGB(0x313131)]; } return _areaLabel; } - (UIButton *)areaCodeButton { if (!_areaCodeButton) { _areaCodeButton = [UIButton buttonWithType:UIButtonTypeCustom]; [_areaCodeButton addTarget:self action:@selector(didTapAreaButton) forControlEvents:UIControlEventTouchUpInside]; } return _areaCodeButton; } - (UIButton *)verificationCodeButton { if (!_verificationCodeButton) { _verificationCodeButton = [UIButton buttonWithType:UIButtonTypeCustom]; [_verificationCodeButton.titleLabel setFont:kFontMedium(14)]; [_verificationCodeButton setTitle:YMLocalizedString(@"20.20.51_text_8") forState:UIControlStateNormal]; [_verificationCodeButton setTitleColor:UIColorFromRGB(0xff8c03) forState:UIControlStateNormal]; [_verificationCodeButton setTitleColor:UIColorFromRGB(0xafb1b3) forState:UIControlStateDisabled]; [_verificationCodeButton addTarget:self action:@selector(didTapVerificationButton) forControlEvents:UIControlEventTouchUpInside]; } return _verificationCodeButton; } - (UIButton *)rightActionButton { if (!_rightActionButton) { _rightActionButton = [UIButton buttonWithType:UIButtonTypeCustom]; [_rightActionButton setBackgroundImage:kImage(@"login_page_kaigan") forState:UIControlStateNormal]; [_rightActionButton setBackgroundImage:kImage(@"login_page_eye_close") forState:UIControlStateSelected]; [_rightActionButton addTarget:self action:@selector(didTapRightActionButton) forControlEvents:UIControlEventTouchUpInside]; } return _rightActionButton; } @end