// // KBEmailRegistVC.m // keyBoard // // Created by Mac on 2025/12/3. // #import "KBEmailRegistVC.h" #import "KBEmailLoginVC.h" #import #import "KBLoginVM.h" #import "AppDelegate.h" @interface KBEmailRegistVC () // 背景 @property (nonatomic, strong) UIImageView *bgImageView; // 整体背景图:login_bg_icon @property (nonatomic, strong) UIImageView *topRightImageView; // 顶部右侧装饰图:login_jianp_icon @property (nonatomic, strong) UIButton *backButton; // 顶部左侧返回按钮 // 底部白色容器(仅上圆角 26) @property (nonatomic, strong) UIView *contentContainerView; // 可滚动区域(小屏设备内容较多时允许纵向滚动) @property (nonatomic, strong) UIScrollView *scrollView; @property (nonatomic, strong) UIView *scrollContentView; // 标题 @property (nonatomic, strong) UILabel *titleLabel; // 输入框 @property (nonatomic, strong) UIView *emailFieldContainer; @property (nonatomic, strong) UITextField *emailTextField; @property (nonatomic, strong) UIView *passwordFieldContainer; @property (nonatomic, strong) UITextField *passwordTextField; @property (nonatomic, strong) UIButton *passwordToggleButton; // 显示/隐藏密码 @property (nonatomic, strong) UIView *repeatPasswordFieldContainer; @property (nonatomic, strong) UITextField *repeatPasswordTextField; @property (nonatomic, strong) UIButton *repeatPasswordToggleButton; // 主要提交按钮 @property (nonatomic, strong) UIButton *submitButton; // 绿色 Login 按钮 // 其他登录方式 @property (nonatomic, strong) UIControl *appleLoginButton; // Continue Through Apple(ASAuthorizationAppleIDButton) @property (nonatomic, strong) UIButton *emailLoginButton; // Continue Via Email // 协议 & 底部文案 @property (nonatomic, strong) UITextView *agreementTextView; // 底部协议富文本 //@property (nonatomic, strong) UILabel *accountTipLabel; // “Already Have An Account?” //@property (nonatomic, strong) UIButton *switchAccountButton; // “Sign In” @end @implementation KBEmailRegistVC - (void)viewDidLoad { [super viewDidLoad]; // 与 KBLoginVC 一致,使用自定义背景与返回按钮,不展示通用导航栏 self.kb_enableCustomNavBar = NO; self.view.backgroundColor = [UIColor whiteColor]; [self setupUI]; } - (void)viewDidLayoutSubviews { [super viewDidLayoutSubviews]; // 仅白色容器的左上、右上圆角为 26,跟 KBLoginVC 保持一致 if (!CGRectIsEmpty(self.contentContainerView.bounds)) { UIRectCorner corners = UIRectCornerTopLeft | UIRectCornerTopRight; UIBezierPath *path = [UIBezierPath bezierPathWithRoundedRect:self.contentContainerView.bounds byRoundingCorners:corners cornerRadii:CGSizeMake(26, 26)]; CAShapeLayer *mask = [CAShapeLayer layer]; mask.frame = self.contentContainerView.bounds; mask.path = path.CGPath; self.contentContainerView.layer.mask = mask; } } #pragma mark - UI - (void)setupUI { // 背景图 [self.view addSubview:self.bgImageView]; [self.bgImageView mas_makeConstraints:^(MASConstraintMaker *make) { make.edges.equalTo(self.view); }]; // 顶部左侧返回按钮 [self.view addSubview:self.backButton]; [self.backButton mas_makeConstraints:^(MASConstraintMaker *make) { make.left.equalTo(self.view).offset(16); make.top.equalTo(self.view).offset(KB_StatusBarHeight() + 8); make.width.height.mas_equalTo(32); }]; // 顶部右侧装饰图 [self.view addSubview:self.topRightImageView]; [self.topRightImageView mas_makeConstraints:^(MASConstraintMaker *make) { make.top.equalTo(self.view).offset(KB_StatusBarHeight() + KBFit(24)); make.right.equalTo(self.view).offset(KBFit(10)); make.width.mas_equalTo(KBFit(244)); make.height.mas_equalTo(KBFit(224)); }]; // 底部白色容器 [self.view addSubview:self.contentContainerView]; [self.contentContainerView mas_makeConstraints:^(MASConstraintMaker *make) { make.left.right.bottom.equalTo(self.view); // 顶部位置与 KBLoginVC 大致保持一致 make.top.equalTo(self.view).offset(KBFit(272)); }]; // 可滚动区域:保证小屏设备能完整展示所有控件 [self.contentContainerView addSubview:self.scrollView]; [self.scrollView mas_makeConstraints:^(MASConstraintMaker *make) { make.edges.equalTo(self.contentContainerView); }]; [self.scrollView addSubview:self.scrollContentView]; [self.scrollContentView mas_makeConstraints:^(MASConstraintMaker *make) { make.edges.equalTo(self.scrollView); make.width.equalTo(self.scrollView); // 只允许纵向滚动 }]; // 标题(Sign Up) [self.scrollContentView addSubview:self.titleLabel]; [self.titleLabel mas_makeConstraints:^(MASConstraintMaker *make) { make.top.equalTo(self.scrollContentView).offset(27); make.centerX.equalTo(self.scrollContentView); }]; // 邮箱输入 [self.scrollContentView addSubview:self.emailFieldContainer]; [self.emailFieldContainer mas_makeConstraints:^(MASConstraintMaker *make) { make.top.equalTo(self.titleLabel.mas_bottom).offset(24); make.left.equalTo(self.scrollContentView).offset(30); make.right.equalTo(self.scrollContentView).offset(-30); make.height.mas_equalTo(52); }]; [self.emailFieldContainer addSubview:self.emailTextField]; [self.emailTextField mas_makeConstraints:^(MASConstraintMaker *make) { make.edges.equalTo(self.emailFieldContainer).insets(UIEdgeInsetsMake(0, 16, 0, 16)); }]; // 密码输入 [self.scrollContentView addSubview:self.passwordFieldContainer]; [self.passwordFieldContainer mas_makeConstraints:^(MASConstraintMaker *make) { make.top.equalTo(self.emailFieldContainer.mas_bottom).offset(16); make.left.right.equalTo(self.emailFieldContainer); make.height.equalTo(self.emailFieldContainer); }]; [self.passwordFieldContainer addSubview:self.passwordToggleButton]; [self.passwordToggleButton mas_makeConstraints:^(MASConstraintMaker *make) { make.centerY.equalTo(self.passwordFieldContainer); make.right.equalTo(self.passwordFieldContainer).offset(-16); make.width.height.mas_equalTo(24); }]; [self.passwordFieldContainer addSubview:self.passwordTextField]; [self.passwordTextField mas_makeConstraints:^(MASConstraintMaker *make) { make.top.bottom.equalTo(self.passwordFieldContainer); make.left.equalTo(self.passwordFieldContainer).offset(16); make.right.equalTo(self.passwordToggleButton.mas_left).offset(-8); }]; // 重复密码输入 [self.scrollContentView addSubview:self.repeatPasswordFieldContainer]; [self.repeatPasswordFieldContainer mas_makeConstraints:^(MASConstraintMaker *make) { make.top.equalTo(self.passwordFieldContainer.mas_bottom).offset(16); make.left.right.height.equalTo(self.emailFieldContainer); }]; [self.repeatPasswordFieldContainer addSubview:self.repeatPasswordToggleButton]; [self.repeatPasswordToggleButton mas_makeConstraints:^(MASConstraintMaker *make) { make.centerY.equalTo(self.repeatPasswordFieldContainer); make.right.equalTo(self.repeatPasswordFieldContainer).offset(-16); make.width.height.mas_equalTo(24); }]; [self.repeatPasswordFieldContainer addSubview:self.repeatPasswordTextField]; [self.repeatPasswordTextField mas_makeConstraints:^(MASConstraintMaker *make) { make.top.bottom.equalTo(self.repeatPasswordFieldContainer); make.left.equalTo(self.repeatPasswordFieldContainer).offset(16); make.right.equalTo(self.repeatPasswordToggleButton.mas_left).offset(-8); }]; // 提交按钮(绿色 Login) [self.scrollContentView addSubview:self.submitButton]; [self.submitButton mas_makeConstraints:^(MASConstraintMaker *make) { make.top.equalTo(self.repeatPasswordFieldContainer.mas_bottom).offset(24); make.left.right.equalTo(self.emailFieldContainer); make.height.mas_equalTo(56); }]; // Apple 登录方式 [self.scrollContentView addSubview:self.appleLoginButton]; [self.appleLoginButton mas_makeConstraints:^(MASConstraintMaker *make) { make.top.equalTo(self.submitButton.mas_bottom).offset(24); make.left.right.equalTo(self.emailFieldContainer); make.height.mas_equalTo(52); }]; // 邮箱登录方式 [self.scrollContentView addSubview:self.emailLoginButton]; [self.emailLoginButton mas_makeConstraints:^(MASConstraintMaker *make) { make.top.equalTo(self.appleLoginButton.mas_bottom).offset(12); make.left.right.height.equalTo(self.appleLoginButton); }]; // 协议文案 [self.scrollContentView addSubview:self.agreementTextView]; [self.agreementTextView mas_makeConstraints:^(MASConstraintMaker *make) { // 顶部挂在邮箱登录按钮下方,底部挂到 scrollContentView,既保证布局又撑开滚动区域 make.top.equalTo(self.emailLoginButton.mas_bottom).offset(16); make.bottom.equalTo(self.scrollContentView).offset(-KB_SAFE_BOTTOM - 16); make.left.equalTo(self.scrollContentView).offset(30); make.right.equalTo(self.scrollContentView).offset(-30); }]; // 底部账号切换文案 // UIView *accountLine = [UIView new]; // [self.scrollContentView addSubview:accountLine]; // [accountLine mas_makeConstraints:^(MASConstraintMaker *make) { // make.top.equalTo(self.agreementTextView.mas_bottom).offset(16); // make.centerX.equalTo(self.scrollContentView); // make.bottom.equalTo(self.scrollContentView).offset(-KB_SAFE_BOTTOM - 16); // }]; // [accountLine addSubview:self.accountTipLabel]; // [accountLine addSubview:self.switchAccountButton]; // // [self.accountTipLabel mas_makeConstraints:^(MASConstraintMaker *make) { // make.top.left.bottom.equalTo(accountLine); // }]; // // [self.switchAccountButton mas_makeConstraints:^(MASConstraintMaker *make) { // make.left.equalTo(self.accountTipLabel.mas_right).offset(4); // make.right.equalTo(accountLine); // make.centerY.equalTo(self.accountTipLabel); // }]; } #pragma mark - Actions - (void)onTapBack { // 与 BaseViewController 的返回逻辑保持一致:优先 pop,其次 dismiss if (self.navigationController && self.navigationController.viewControllers.count > 1) { [self.navigationController popViewControllerAnimated:YES]; } else if (self.presentingViewController) { [self dismissViewControllerAnimated:YES completion:nil]; } } - (void)onTapSubmit { // 后续接入具体注册/登录逻辑 KBLOG(@"onTapSubmit email=%@, password length=%zd", self.emailTextField.text, self.passwordTextField.text.length); } - (void)onTapForgotPassword { KBLOG(@"onTapForgotPassword in KBEmailRegistVC"); } //- (void)onTapSwitchAccount { // // 注册页/登录页互跳逻辑后续接入 // KBLOG(@"onTapSwitchAccount"); // //} - (void)onTapTogglePassword:(UIButton *)sender { sender.selected = !sender.selected; BOOL showPassword = sender.selected; if (sender == self.passwordToggleButton) { self.passwordTextField.secureTextEntry = !showPassword; } else if (sender == self.repeatPasswordToggleButton) { self.repeatPasswordTextField.secureTextEntry = !showPassword; } } - (void)onTapAppleLogin { // 先校验表单:邮箱、密码、重复密码均有值且两次密码一致 NSString *email = [self.emailTextField.text ?: @"" stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; NSString *pwd = self.passwordTextField.text ?: @""; NSString *repeat = self.repeatPasswordTextField.text ?: @""; if (email.length == 0 || pwd.length == 0 || repeat.length == 0) { [KBHUD showInfo:KBLocalized(@"Please complete all fields")]; return; } if (![pwd isEqualToString:repeat]) { [KBHUD showInfo:KBLocalized(@"The two passwords do not match")]; return; } KBLOG(@"onTapAppleLogin in KBEmailRegistVC - form validated"); // 复用登录页的 Apple 登录逻辑 [[KBLoginVM shared] signInWithAppleFromViewController:KB_CURRENT_NAV completion:^(BOOL success, NSError * _Nullable error) { if (success) { [KBHUD showInfo:KBLocalized(@"Signed in successfully")]; // 登录成功后切换到主 TabBar dispatch_async(dispatch_get_main_queue(), ^{ id appDelegate = UIApplication.sharedApplication.delegate; if ([appDelegate respondsToSelector:@selector(setupRootVC)]) { AppDelegate *delegate = (AppDelegate *)appDelegate; [delegate toMainTabbarVC]; } }); } else { NSString *msg = error.localizedDescription ?: KBLocalized(@"Sign-in failed"); [KBHUD showInfo:msg]; } }]; } - (void)onTapEmailLogin { KBLOG(@"onTapEmailLogin in KBEmailRegistVC"); KBEmailLoginVC *vc = [[KBEmailLoginVC alloc] init]; UINavigationController *nav = KB_CURRENT_NAV; if ([nav isKindOfClass:[BaseNavigationController class]]) { [(BaseNavigationController *)nav kb_pushViewControllerRemovingSameClass:vc animated:YES]; } else { [nav pushViewController:vc animated:YES]; } } #pragma mark - Agreement Tap - (void)kb_handleAgreementTap:(UITapGestureRecognizer *)tap { UITextView *textView = self.agreementTextView; CGPoint point = [tap locationInView:textView]; // 将点击点转换到 textContainer 坐标系 CGPoint location = point; location.x -= textView.textContainerInset.left; location.y -= textView.textContainerInset.top; NSLayoutManager *layoutManager = textView.layoutManager; NSTextContainer *textContainer = textView.textContainer; NSUInteger glyphIndex = [layoutManager glyphIndexForPoint:location inTextContainer:textContainer]; if (glyphIndex >= textView.textStorage.length) { return; } NSUInteger charIndex = [layoutManager characterIndexForGlyphAtIndex:glyphIndex]; NSString *lowerFull = textView.text.lowercaseString ?: @""; NSRange termsRange = [lowerFull rangeOfString:@"terms of service"]; NSRange privacyRange = [lowerFull rangeOfString:@"privacy policy"]; BOOL hitTerms = (termsRange.location != NSNotFound && NSLocationInRange(charIndex, termsRange)); BOOL hitPrivacy = (privacyRange.location != NSNotFound && NSLocationInRange(charIndex, privacyRange)); if (hitTerms || hitPrivacy) { KBLOG(@"tap policy in KBEmailRegistVC"); // 后续可统一跳转到协议页 if (hitTerms == true) { [KBHUD showInfo:@"hitTerms"]; }else{ [KBHUD showInfo:@"hitPrivacy"]; } } } #pragma mark - UITextFieldDelegate - (BOOL)textFieldShouldReturn:(UITextField *)textField { if (textField == self.emailTextField) { [self.passwordTextField becomeFirstResponder]; } else if (textField == self.passwordTextField) { [self.repeatPasswordTextField becomeFirstResponder]; } else if (textField == self.repeatPasswordTextField) { [textField resignFirstResponder]; [self onTapSubmit]; } return YES; } #pragma mark - Lazy UI - (UIImageView *)bgImageView { if (!_bgImageView) { _bgImageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"login_bg_icon"]]; _bgImageView.contentMode = UIViewContentModeScaleAspectFill; _bgImageView.clipsToBounds = YES; } return _bgImageView; } - (UIImageView *)topRightImageView { if (!_topRightImageView) { _topRightImageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"login_jianp_icon"]]; _topRightImageView.contentMode = UIViewContentModeScaleAspectFit; _topRightImageView.clipsToBounds = YES; } return _topRightImageView; } - (UIButton *)backButton { if (!_backButton) { _backButton = [UIButton buttonWithType:UIButtonTypeCustom]; UIImage *img = [UIImage imageNamed:@"back"]; if (!img) { img = [UIImage imageNamed:@"back_black_icon"]; } if (img) { [_backButton setImage:img forState:UIControlStateNormal]; } _backButton.adjustsImageWhenHighlighted = YES; _backButton.contentHorizontalAlignment = UIControlContentHorizontalAlignmentLeft; [_backButton addTarget:self action:@selector(onTapBack) forControlEvents:UIControlEventTouchUpInside]; } return _backButton; } - (UIView *)contentContainerView { if (!_contentContainerView) { _contentContainerView = [UIView new]; _contentContainerView.backgroundColor = [UIColor whiteColor]; } return _contentContainerView; } - (UIScrollView *)scrollView { if (!_scrollView) { _scrollView = [UIScrollView new]; _scrollView.showsVerticalScrollIndicator = NO; _scrollView.alwaysBounceVertical = NO; // 内容不超出时不产生多余回弹 _scrollView.keyboardDismissMode = UIScrollViewKeyboardDismissModeOnDrag; } return _scrollView; } - (UIView *)scrollContentView { if (!_scrollContentView) { _scrollContentView = [UIView new]; _scrollContentView.backgroundColor = [UIColor clearColor]; } return _scrollContentView; } - (UILabel *)titleLabel { if (!_titleLabel) { _titleLabel = [UILabel new]; // 注册页标题 _titleLabel.text = KBLocalized(@"Sign Up"); _titleLabel.textColor = [UIColor colorWithHex:KBBlackValue]; _titleLabel.font = [KBFont bold:18]; _titleLabel.textAlignment = NSTextAlignmentCenter; } return _titleLabel; } - (UIView *)emailFieldContainer { if (!_emailFieldContainer) { _emailFieldContainer = [UIView new]; _emailFieldContainer.backgroundColor = [UIColor colorWithHex:0xF7F7F7]; _emailFieldContainer.layer.cornerRadius = 10.0; _emailFieldContainer.layer.masksToBounds = YES; } return _emailFieldContainer; } - (UITextField *)emailTextField { if (!_emailTextField) { _emailTextField = [[UITextField alloc] init]; _emailTextField.delegate = self; _emailTextField.keyboardType = UIKeyboardTypeEmailAddress; _emailTextField.autocapitalizationType = UITextAutocapitalizationTypeNone; _emailTextField.autocorrectionType = UITextAutocorrectionTypeNo; _emailTextField.clearButtonMode = UITextFieldViewModeWhileEditing; _emailTextField.textColor = [UIColor colorWithHex:KBBlackValue]; _emailTextField.font = [KBFont regular:14]; _emailTextField.returnKeyType = UIReturnKeyNext; NSString *ph = KBLocalized(@"Enter Email Address"); _emailTextField.attributedPlaceholder = [[NSAttributedString alloc] initWithString:ph attributes:@{ NSForegroundColorAttributeName : [UIColor colorWithWhite:0.75 alpha:1.0], NSFontAttributeName : [KBFont regular:14] }]; } return _emailTextField; } - (UIView *)passwordFieldContainer { if (!_passwordFieldContainer) { _passwordFieldContainer = [UIView new]; _passwordFieldContainer.backgroundColor = [UIColor colorWithHex:0xF7F7F7]; _passwordFieldContainer.layer.cornerRadius = 10.0; _passwordFieldContainer.layer.masksToBounds = YES; } return _passwordFieldContainer; } - (UITextField *)passwordTextField { if (!_passwordTextField) { _passwordTextField = [[UITextField alloc] init]; _passwordTextField.delegate = self; _passwordTextField.secureTextEntry = YES; _passwordTextField.textColor = [UIColor colorWithHex:KBBlackValue]; _passwordTextField.font = [KBFont regular:14]; _passwordTextField.returnKeyType = UIReturnKeyDone; NSString *ph = KBLocalized(@"Enter Password"); _passwordTextField.attributedPlaceholder = [[NSAttributedString alloc] initWithString:ph attributes:@{ NSForegroundColorAttributeName : [UIColor colorWithWhite:0.75 alpha:1.0], NSFontAttributeName : [KBFont regular:14] }]; } return _passwordTextField; } - (UIButton *)passwordToggleButton { if (!_passwordToggleButton) { _passwordToggleButton = [UIButton buttonWithType:UIButtonTypeCustom]; UIImage *eye = [UIImage imageNamed:@"login_eye_icon"]; UIImage *eyeSlash = [UIImage imageNamed:@"login_eyeslash_icon"]; [_passwordToggleButton setImage:eye forState:UIControlStateNormal]; [_passwordToggleButton setImage:eyeSlash forState:UIControlStateSelected]; [_passwordToggleButton addTarget:self action:@selector(onTapTogglePassword:) forControlEvents:UIControlEventTouchUpInside]; } return _passwordToggleButton; } - (UIView *)repeatPasswordFieldContainer { if (!_repeatPasswordFieldContainer) { _repeatPasswordFieldContainer = [UIView new]; _repeatPasswordFieldContainer.backgroundColor = [UIColor colorWithHex:0xF7F7F7]; _repeatPasswordFieldContainer.layer.cornerRadius = 10.0; _repeatPasswordFieldContainer.layer.masksToBounds = YES; } return _repeatPasswordFieldContainer; } - (UITextField *)repeatPasswordTextField { if (!_repeatPasswordTextField) { _repeatPasswordTextField = [[UITextField alloc] init]; _repeatPasswordTextField.delegate = self; _repeatPasswordTextField.secureTextEntry = YES; _repeatPasswordTextField.textColor = [UIColor colorWithHex:KBBlackValue]; _repeatPasswordTextField.font = [KBFont regular:14]; _repeatPasswordTextField.returnKeyType = UIReturnKeyDone; NSString *ph = KBLocalized(@"Enter Repeat Password"); _repeatPasswordTextField.attributedPlaceholder = [[NSAttributedString alloc] initWithString:ph attributes:@{ NSForegroundColorAttributeName : [UIColor colorWithWhite:0.75 alpha:1.0], NSFontAttributeName : [KBFont regular:14] }]; } return _repeatPasswordTextField; } - (UIButton *)repeatPasswordToggleButton { if (!_repeatPasswordToggleButton) { _repeatPasswordToggleButton = [UIButton buttonWithType:UIButtonTypeCustom]; UIImage *eye = [UIImage imageNamed:@"login_eye_icon"]; UIImage *eyeSlash = [UIImage imageNamed:@"login_eyeslash_icon"]; [_repeatPasswordToggleButton setImage:eye forState:UIControlStateNormal]; [_repeatPasswordToggleButton setImage:eyeSlash forState:UIControlStateSelected]; [_repeatPasswordToggleButton addTarget:self action:@selector(onTapTogglePassword:) forControlEvents:UIControlEventTouchUpInside]; } return _repeatPasswordToggleButton; } - (UIButton *)forgotPasswordButton { // 注册页当前未使用“忘记密码”,保留方法避免外部引用报错 return nil; } - (UIButton *)submitButton { if (!_submitButton) { _submitButton = [UIButton buttonWithType:UIButtonTypeCustom]; // 文案可按实际是“Login”还是“Sign Up”调整 [_submitButton setTitle:KBLocalized(@"Login") forState:UIControlStateNormal]; [_submitButton setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal]; _submitButton.titleLabel.font = [KBFont medium:16]; _submitButton.backgroundColor = [UIColor colorWithHex:KBColorValue]; _submitButton.layer.cornerRadius = 11.0; _submitButton.layer.masksToBounds = YES; [_submitButton addTarget:self action:@selector(onTapSubmit) forControlEvents:UIControlEventTouchUpInside]; } return _submitButton; } - (UIControl *)appleLoginButton { if (!_appleLoginButton) { ASAuthorizationAppleIDButton *btn = [ASAuthorizationAppleIDButton buttonWithType:ASAuthorizationAppleIDButtonTypeSignIn style:ASAuthorizationAppleIDButtonStyleWhite]; [btn addTarget:self action:@selector(onTapAppleLogin) forControlEvents:UIControlEventTouchUpInside]; btn.cornerRadius = 10.0; btn.layer.borderColor = [UIColor colorWithHex:0xE5E5E5].CGColor; btn.layer.borderWidth = 1; btn.layer.cornerRadius = 10.0; btn.layer.masksToBounds = true; _appleLoginButton = btn; } return _appleLoginButton; } - (UIButton *)emailLoginButton { if (!_emailLoginButton) { _emailLoginButton = [UIButton buttonWithType:UIButtonTypeCustom]; [_emailLoginButton setTitle:KBLocalized(@"Continue Via Email") forState:UIControlStateNormal]; [_emailLoginButton setTitleColor:[UIColor colorWithHex:KBBlackValue] forState:UIControlStateNormal]; _emailLoginButton.titleLabel.font = [KBFont medium:19]; _emailLoginButton.backgroundColor = [UIColor whiteColor]; _emailLoginButton.layer.cornerRadius = 10.0; _emailLoginButton.layer.masksToBounds = YES; _emailLoginButton.layer.borderColor = [UIColor colorWithHex:0xE5E5E5].CGColor; _emailLoginButton.layer.borderWidth = 1; _emailLoginButton.contentHorizontalAlignment = UIControlContentHorizontalAlignmentCenter; UIImage *icon = [UIImage imageNamed:@"login_email_icon"]; if (icon) { CGFloat targetHeight = 12; CGFloat scale = targetHeight / icon.size.height; CGSize targetSize = CGSizeMake(icon.size.width * scale, targetHeight); UIGraphicsBeginImageContextWithOptions(targetSize, NO, 0.0); [icon drawInRect:CGRectMake(0, 0, targetSize.width, targetSize.height)]; UIImage *scaledIcon = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); [_emailLoginButton setImage:scaledIcon forState:UIControlStateNormal]; // 图标与文字间距 _emailLoginButton.titleEdgeInsets = UIEdgeInsetsMake(0, 10, 0, 0); } [_emailLoginButton addTarget:self action:@selector(onTapEmailLogin) forControlEvents:UIControlEventTouchUpInside]; } return _emailLoginButton; } - (UITextView *)agreementTextView { if (!_agreementTextView) { _agreementTextView = [UITextView new]; _agreementTextView.backgroundColor = [UIColor clearColor]; _agreementTextView.editable = NO; _agreementTextView.selectable = NO; _agreementTextView.scrollEnabled = NO; _agreementTextView.textAlignment = NSTextAlignmentCenter; _agreementTextView.textContainerInset = UIEdgeInsetsZero; _agreementTextView.textContainer.lineFragmentPadding = 0; NSString *fullText = @"By continuing, you agree to our terms of service and confirm that you have read our privacy policy"; NSString *termsText = @"terms of service"; NSString *privacyText = @"privacy policy"; NSMutableParagraphStyle *paragraph = [[NSMutableParagraphStyle alloc] init]; paragraph.alignment = NSTextAlignmentCenter; NSMutableAttributedString *attr = [[NSMutableAttributedString alloc] initWithString:fullText attributes:@{ NSFontAttributeName : [KBFont regular:10], NSForegroundColorAttributeName : [UIColor colorWithHex:0x717171], NSParagraphStyleAttributeName : paragraph }]; NSString *lowerFull = fullText.lowercaseString; NSRange termsRange = [lowerFull rangeOfString:termsText.lowercaseString]; if (termsRange.location != NSNotFound) { [attr addAttributes:@{ NSForegroundColorAttributeName : [UIColor colorWithHex:KBBlackValue], NSUnderlineStyleAttributeName : @(NSUnderlineStyleNone) } range:termsRange]; } NSRange privacyRange = [lowerFull rangeOfString:privacyText.lowercaseString]; if (privacyRange.location != NSNotFound) { [attr addAttributes:@{ NSForegroundColorAttributeName : [UIColor colorWithHex:KBBlackValue], NSUnderlineStyleAttributeName : @(NSUnderlineStyleNone) } range:privacyRange]; } _agreementTextView.linkTextAttributes = @{ NSForegroundColorAttributeName : [UIColor colorWithHex:KBBlackValue], NSUnderlineStyleAttributeName : @(NSUnderlineStyleNone) }; _agreementTextView.attributedText = attr; UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(kb_handleAgreementTap:)]; _agreementTextView.userInteractionEnabled = YES; [_agreementTextView addGestureRecognizer:tap]; } return _agreementTextView; } //- (UILabel *)accountTipLabel { // if (!_accountTipLabel) { // _accountTipLabel = [UILabel new]; // _accountTipLabel.text = KBLocalized(@"Already Have An Account?"); // _accountTipLabel.font = [KBFont regular:10]; // _accountTipLabel.textColor = [UIColor colorWithHex:KBBlackValue]; // } // return _accountTipLabel; //} // //- (UIButton *)switchAccountButton { // if (!_switchAccountButton) { // _switchAccountButton = [UIButton buttonWithType:UIButtonTypeCustom]; // [_switchAccountButton setTitle:KBLocalized(@"Sign In") forState:UIControlStateNormal]; // [_switchAccountButton setTitleColor:[UIColor colorWithHex:KBColorValue] forState:UIControlStateNormal]; // _switchAccountButton.titleLabel.font = [KBFont medium:10]; // [_switchAccountButton addTarget:self // action:@selector(onTapSwitchAccount) // forControlEvents:UIControlEventTouchUpInside]; // } // return _switchAccountButton; //} @end