Initial clean commit
This commit is contained in:
295
Example/SellyCloudSDK/Controllers/AVLoginViewController.m
Normal file
295
Example/SellyCloudSDK/Controllers/AVLoginViewController.m
Normal file
@@ -0,0 +1,295 @@
|
||||
//
|
||||
// AVLoginViewController.m
|
||||
// AVDemo
|
||||
//
|
||||
|
||||
#import "AVLoginViewController.h"
|
||||
#import "AVUserManager.h"
|
||||
#import <Masonry/Masonry.h>
|
||||
|
||||
@interface AVLoginViewController () <UITextFieldDelegate>
|
||||
@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
|
||||
Reference in New Issue
Block a user