// // AVLoginViewController.m // AVDemo // #import "AVLoginViewController.h" #import "AVUserManager.h" #import @interface AVLoginViewController () @property (nonatomic, strong) UIImageView *logoImageView; @property (nonatomic, strong) UILabel *titleLabel; @property (nonatomic, strong) UIView *usernameContainer; @property (nonatomic, strong) UITextField *usernameTextField; @property (nonatomic, strong) UIView *passwordContainer; @property (nonatomic, strong) UITextField *passwordTextField; @property (nonatomic, strong) UIButton *passwordToggleButton; @property (nonatomic, strong) UIButton *loginButton; @end @implementation AVLoginViewController - (void)viewDidLoad { [super viewDidLoad]; self.view.backgroundColor = [UIColor systemBackgroundColor]; [self setupUI]; [self loadSavedUsername]; // 添加点击手势,点击空白处收起键盘 UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(dismissKeyboard)]; [self.view addGestureRecognizer:tapGesture]; } - (void)setupUI { // Logo 图标 self.logoImageView = [[UIImageView alloc] initWithImage:[UIImage systemImageNamed:@"play.rectangle.on.rectangle.fill"]]; self.logoImageView.tintColor = [UIColor systemBlueColor]; self.logoImageView.contentMode = UIViewContentModeScaleAspectFit; [self.view addSubview:self.logoImageView]; [self.logoImageView mas_makeConstraints:^(MASConstraintMaker *make) { make.centerX.equalTo(self.view); make.top.equalTo(self.view.mas_safeAreaLayoutGuideTop).offset(80); make.width.height.equalTo(@100); }]; // 标题 self.titleLabel = [[UILabel alloc] init]; self.titleLabel.text = @"欢迎使用"; self.titleLabel.font = [UIFont systemFontOfSize:28 weight:UIFontWeightBold]; self.titleLabel.textAlignment = NSTextAlignmentCenter; [self.view addSubview:self.titleLabel]; [self.titleLabel mas_makeConstraints:^(MASConstraintMaker *make) { make.centerX.equalTo(self.view); make.top.equalTo(self.logoImageView.mas_bottom).offset(24); }]; // 用户名输入框容器 self.usernameContainer = [[UIView alloc] init]; self.usernameContainer.backgroundColor = [UIColor secondarySystemBackgroundColor]; self.usernameContainer.layer.cornerRadius = 12; [self.view addSubview:self.usernameContainer]; [self.usernameContainer mas_makeConstraints:^(MASConstraintMaker *make) { make.centerX.equalTo(self.view); make.top.equalTo(self.titleLabel.mas_bottom).offset(60); make.left.equalTo(self.view).offset(32); make.right.equalTo(self.view).offset(-32); make.height.equalTo(@50); }]; // 用户名图标 UIImageView *usernameIcon = [[UIImageView alloc] initWithImage:[UIImage systemImageNamed:@"person.fill"]]; usernameIcon.tintColor = [UIColor systemGrayColor]; usernameIcon.contentMode = UIViewContentModeScaleAspectFit; [self.usernameContainer addSubview:usernameIcon]; [usernameIcon mas_makeConstraints:^(MASConstraintMaker *make) { make.left.equalTo(self.usernameContainer).offset(16); make.centerY.equalTo(self.usernameContainer); make.width.height.equalTo(@20); }]; // 用户名输入框 self.usernameTextField = [[UITextField alloc] init]; self.usernameTextField.placeholder = @"请输入用户名"; self.usernameTextField.font = [UIFont systemFontOfSize:16]; self.usernameTextField.returnKeyType = UIReturnKeyNext; self.usernameTextField.autocapitalizationType = UITextAutocapitalizationTypeNone; self.usernameTextField.autocorrectionType = UITextAutocorrectionTypeNo; self.usernameTextField.delegate = self; [self.usernameContainer addSubview:self.usernameTextField]; [self.usernameTextField mas_makeConstraints:^(MASConstraintMaker *make) { make.left.equalTo(usernameIcon.mas_right).offset(12); make.right.equalTo(self.usernameContainer).offset(-16); make.centerY.equalTo(self.usernameContainer); }]; // 密码输入框容器 self.passwordContainer = [[UIView alloc] init]; self.passwordContainer.backgroundColor = [UIColor secondarySystemBackgroundColor]; self.passwordContainer.layer.cornerRadius = 12; [self.view addSubview:self.passwordContainer]; [self.passwordContainer mas_makeConstraints:^(MASConstraintMaker *make) { make.centerX.equalTo(self.view); make.top.equalTo(self.usernameContainer.mas_bottom).offset(16); make.left.equalTo(self.view).offset(32); make.right.equalTo(self.view).offset(-32); make.height.equalTo(@50); }]; // 密码图标 UIImageView *passwordIcon = [[UIImageView alloc] initWithImage:[UIImage systemImageNamed:@"lock.fill"]]; passwordIcon.tintColor = [UIColor systemGrayColor]; passwordIcon.contentMode = UIViewContentModeScaleAspectFit; [self.passwordContainer addSubview:passwordIcon]; [passwordIcon mas_makeConstraints:^(MASConstraintMaker *make) { make.left.equalTo(self.passwordContainer).offset(16); make.centerY.equalTo(self.passwordContainer); make.width.height.equalTo(@20); }]; // 密码输入框 self.passwordTextField = [[UITextField alloc] init]; self.passwordTextField.placeholder = @"请输入密码"; self.passwordTextField.font = [UIFont systemFontOfSize:16]; self.passwordTextField.secureTextEntry = YES; self.passwordTextField.returnKeyType = UIReturnKeyDone; self.passwordTextField.autocapitalizationType = UITextAutocapitalizationTypeNone; self.passwordTextField.autocorrectionType = UITextAutocorrectionTypeNo; self.passwordTextField.delegate = self; [self.passwordContainer addSubview:self.passwordTextField]; // 密码显示/隐藏切换按钮 self.passwordToggleButton = [UIButton buttonWithType:UIButtonTypeCustom]; [self.passwordToggleButton setImage:[UIImage systemImageNamed:@"eye.slash.fill"] forState:UIControlStateNormal]; [self.passwordToggleButton setImage:[UIImage systemImageNamed:@"eye.fill"] forState:UIControlStateSelected]; self.passwordToggleButton.tintColor = [UIColor systemGrayColor]; [self.passwordToggleButton addTarget:self action:@selector(togglePasswordVisibility) forControlEvents:UIControlEventTouchUpInside]; [self.passwordContainer addSubview:self.passwordToggleButton]; [self.passwordToggleButton mas_makeConstraints:^(MASConstraintMaker *make) { make.right.equalTo(self.passwordContainer).offset(-16); make.centerY.equalTo(self.passwordContainer); make.width.height.equalTo(@24); }]; [self.passwordTextField mas_makeConstraints:^(MASConstraintMaker *make) { make.left.equalTo(passwordIcon.mas_right).offset(12); make.right.equalTo(self.passwordToggleButton.mas_left).offset(-12); make.centerY.equalTo(self.passwordContainer); }]; // 登录按钮 self.loginButton = [UIButton buttonWithType:UIButtonTypeSystem]; [self.loginButton setTitle:@"登录" forState:UIControlStateNormal]; self.loginButton.titleLabel.font = [UIFont systemFontOfSize:18 weight:UIFontWeightSemibold]; self.loginButton.backgroundColor = [UIColor systemBlueColor]; [self.loginButton setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal]; self.loginButton.layer.cornerRadius = 12; [self.loginButton addTarget:self action:@selector(loginButtonTapped) forControlEvents:UIControlEventTouchUpInside]; [self.view addSubview:self.loginButton]; [self.loginButton mas_makeConstraints:^(MASConstraintMaker *make) { make.centerX.equalTo(self.view); make.top.equalTo(self.passwordContainer.mas_bottom).offset(32); make.left.equalTo(self.view).offset(32); make.right.equalTo(self.view).offset(-32); make.height.equalTo(@50); }]; } - (void)loadSavedUsername { // 从 AVUserManager 获取上次登录的用户名 NSString *savedUsername = [AVUserManager sharedManager].currentUsername; if (savedUsername.length > 0) { self.usernameTextField.text = savedUsername; NSLog(@"✅ 自动填充用户名: %@", savedUsername); // 如果有保存的用户名,自动聚焦到密码输入框 [self.passwordTextField becomeFirstResponder]; } else { // 如果没有保存的用户名,聚焦到用户名输入框 [self.usernameTextField becomeFirstResponder]; } } #pragma mark - Actions - (void)loginButtonTapped { [self dismissKeyboard]; NSString *username = self.usernameTextField.text; NSString *password = self.passwordTextField.text; // 验证输入 if (username.length == 0) { [self showAlertWithMessage:@"请输入用户名"]; return; } if (password.length == 0) { [self showAlertWithMessage:@"请输入密码"]; return; } // 禁用登录按钮,防止重复提交 self.loginButton.enabled = NO; [self.loginButton setTitle:@"登录中..." forState:UIControlStateNormal]; self.loginButton.alpha = 0.6; // 执行登录(异步) __weak typeof(self) weakSelf = self; [[AVUserManager sharedManager] loginWithUsername:username password:password completion:^(BOOL success, NSString * _Nullable errorMessage) { __strong typeof(weakSelf) strongSelf = weakSelf; if (!strongSelf) return; // 恢复登录按钮状态 strongSelf.loginButton.enabled = YES; [strongSelf.loginButton setTitle:@"登录" forState:UIControlStateNormal]; strongSelf.loginButton.alpha = 1.0; if (success) { // 登录成功,通知代理 NSLog(@"✅ 登录验证成功"); if ([strongSelf.delegate respondsToSelector:@selector(loginViewControllerDidLogin:)]) { [strongSelf.delegate loginViewControllerDidLogin:strongSelf]; } } else { // 登录失败,显示错误信息 NSLog(@"❌ 登录验证失败: %@", errorMessage); [strongSelf showAlertWithMessage:errorMessage ?: @"登录失败,请重试"]; } }]; } - (void)dismissKeyboard { [self.view endEditing:YES]; } - (void)togglePasswordVisibility { // 切换密码的可见性 self.passwordTextField.secureTextEntry = !self.passwordTextField.secureTextEntry; // 切换按钮状态 self.passwordToggleButton.selected = !self.passwordToggleButton.selected; // 保持光标位置(修复切换时光标跳到开头的问题) NSString *currentText = self.passwordTextField.text; self.passwordTextField.text = @""; self.passwordTextField.text = currentText; } - (void)showAlertWithMessage:(NSString *)message { UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"提示" message:message preferredStyle:UIAlertControllerStyleAlert]; [alert addAction:[UIAlertAction actionWithTitle:@"确定" style:UIAlertActionStyleDefault handler:nil]]; [self presentViewController:alert animated:YES completion:nil]; } #pragma mark - UITextFieldDelegate - (BOOL)textFieldShouldReturn:(UITextField *)textField { if (textField == self.usernameTextField) { // 用户名输入框按回车,跳到密码输入框 [self.passwordTextField becomeFirstResponder]; } else if (textField == self.passwordTextField) { // 密码输入框按回车,执行登录 [self loginButtonTapped]; } return YES; } #pragma mark - Orientation Support - (BOOL)shouldAutorotate { return YES; } - (UIInterfaceOrientationMask)supportedInterfaceOrientations { return UIInterfaceOrientationMaskPortrait; } - (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation { return UIInterfaceOrientationPortrait; } @end