feat: 添加新的登录模块及相关组件

主要变更:
1. 新增 EPLoginViewController 和 EPLoginTypesViewController,提供新的登录界面和功能。
2. 引入 EPLoginInputView 和 EPLoginButton 组件,支持输入框和按钮的自定义。
3. 实现 EPLoginService 和 EPLoginManager,封装登录逻辑和 API 请求。
4. 添加 EPLoginConfig 和 EPLoginState,统一配置和状态管理。
5. 更新 Bridging Header,确保 Swift 和 Objective-C 代码的互操作性。

此更新旨在提升用户登录体验,简化登录流程,并提供更好的代码结构和可维护性。
This commit is contained in:
edwinQQQ
2025-10-13 15:40:43 +08:00
parent 26d9894830
commit 809cc44ca5
14 changed files with 3438 additions and 1213 deletions

View File

@@ -0,0 +1,131 @@
//
// EPLoginButton.swift
// YuMi
//
// Created by AI on 2025-01-27.
// - 使 StackView icon + title
//
import UIKit
import SnapKit
///
protocol EPLoginButtonDelegate: AnyObject {
func loginButtonDidTap(_ button: EPLoginButton)
}
///
class EPLoginButton: UIControl {
// MARK: - Properties
weak var delegate: EPLoginButtonDelegate?
private let stackView = UIStackView()
private let iconImageView = UIImageView()
private let titleLabel = UILabel()
private let leftSpacer = UIView()
private let rightSpacer = UIView()
// MARK: - Initialization
override init(frame: CGRect) {
super.init(frame: frame)
setupUI()
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
// MARK: - Setup
private func setupUI() {
backgroundColor = EPLoginConfig.Colors.background
layer.cornerRadius = EPLoginConfig.Layout.cornerRadius
// StackView
stackView.axis = .horizontal
stackView.alignment = .center
stackView.distribution = .fill
stackView.spacing = 0
stackView.isUserInteractionEnabled = false
addSubview(stackView)
// Icon
iconImageView.contentMode = .scaleAspectFit
// Title
titleLabel.font = .systemFont(ofSize: EPLoginConfig.Layout.inputFontSize, weight: .semibold)
titleLabel.textColor = EPLoginConfig.Colors.text
titleLabel.textAlignment = .center
// Spacers - title
leftSpacer.setContentHuggingPriority(.defaultLow, for: .horizontal)
rightSpacer.setContentHuggingPriority(.defaultLow, for: .horizontal)
// : [Leading 33] + [Icon] + [Flexible Spacer] + [Title] + [Flexible Spacer] + [Trailing 33]
let leadingPadding = UIView()
let trailingPadding = UIView()
stackView.addArrangedSubview(leadingPadding)
stackView.addArrangedSubview(iconImageView)
stackView.addArrangedSubview(leftSpacer)
stackView.addArrangedSubview(titleLabel)
stackView.addArrangedSubview(rightSpacer)
stackView.addArrangedSubview(trailingPadding)
//
stackView.snp.makeConstraints { make in
make.edges.equalToSuperview()
}
leadingPadding.snp.makeConstraints { make in
make.width.equalTo(EPLoginConfig.Layout.loginButtonIconLeading)
}
iconImageView.snp.makeConstraints { make in
make.size.equalTo(EPLoginConfig.Layout.loginButtonIconSize)
}
trailingPadding.snp.makeConstraints { make in
make.width.equalTo(EPLoginConfig.Layout.loginButtonIconLeading)
}
// leftSpacer rightSpacer title
leftSpacer.snp.makeConstraints { make in
make.width.equalTo(rightSpacer)
}
//
addTarget(self, action: #selector(handleTap), for: .touchUpInside)
}
// MARK: - Configuration
///
/// - Parameters:
/// - icon:
/// - title:
func configure(icon: String, title: String) {
iconImageView.image = kImage(icon)
titleLabel.text = title
}
// MARK: - Actions
@objc private func handleTap() {
delegate?.loginButtonDidTap(self)
}
// MARK: - Touch Feedback
override var isHighlighted: Bool {
didSet {
UIView.animate(withDuration: 0.1) {
self.alpha = self.isHighlighted ? 0.7 : 1.0
}
}
}
}