
主要变更: 1. 新增 EPLoginViewController 和 EPLoginTypesViewController,提供新的登录界面和功能。 2. 引入 EPLoginInputView 和 EPLoginButton 组件,支持输入框和按钮的自定义。 3. 实现 EPLoginService 和 EPLoginManager,封装登录逻辑和 API 请求。 4. 添加 EPLoginConfig 和 EPLoginState,统一配置和状态管理。 5. 更新 Bridging Header,确保 Swift 和 Objective-C 代码的互操作性。 此更新旨在提升用户登录体验,简化登录流程,并提供更好的代码结构和可维护性。
116 lines
4.6 KiB
Swift
116 lines
4.6 KiB
Swift
//
|
|
// EPPolicyLabel.swift
|
|
// YuMi
|
|
//
|
|
// Created by AI on 2025-01-27.
|
|
//
|
|
|
|
import UIKit
|
|
|
|
class EPPolicyLabel: UILabel {
|
|
|
|
// MARK: - Properties
|
|
|
|
var onUserAgreementTapped: (() -> Void)?
|
|
var onPrivacyPolicyTapped: (() -> Void)?
|
|
|
|
// MARK: - Initialization
|
|
|
|
override init(frame: CGRect) {
|
|
super.init(frame: frame)
|
|
setup()
|
|
}
|
|
|
|
required init?(coder: NSCoder) {
|
|
super.init(coder: coder)
|
|
setup()
|
|
}
|
|
|
|
// MARK: - Setup
|
|
|
|
private func setup() {
|
|
numberOfLines = 0
|
|
isUserInteractionEnabled = true
|
|
|
|
// 使用 YMLocalizedString 获取文案
|
|
let fullText = YMLocalizedString("XPLoginViewController6")
|
|
let userAgreementText = YMLocalizedString("XPLoginViewController7")
|
|
let privacyPolicyText = YMLocalizedString("XPLoginViewController9")
|
|
|
|
let attributedString = NSMutableAttributedString(string: fullText)
|
|
attributedString.addAttribute(NSAttributedString.Key.foregroundColor,
|
|
value: UIColor.darkGray,
|
|
range: NSRange(location: 0, length: fullText.count))
|
|
attributedString.addAttribute(NSAttributedString.Key.font,
|
|
value: UIFont.systemFont(ofSize: 12),
|
|
range: NSRange(location: 0, length: fullText.count))
|
|
|
|
// 高亮用户协议
|
|
if let userRange = fullText.range(of: userAgreementText) {
|
|
let nsRange = NSRange(userRange, in: fullText)
|
|
attributedString.addAttribute(NSAttributedString.Key.foregroundColor, value: UIColor.black, range: nsRange)
|
|
attributedString.addAttribute(NSAttributedString.Key.underlineStyle, value: NSUnderlineStyle.single.rawValue, range: nsRange)
|
|
}
|
|
|
|
// 高亮隐私政策
|
|
if let privacyRange = fullText.range(of: privacyPolicyText) {
|
|
let nsRange = NSRange(privacyRange, in: fullText)
|
|
attributedString.addAttribute(NSAttributedString.Key.foregroundColor, value: UIColor.black, range: nsRange)
|
|
attributedString.addAttribute(NSAttributedString.Key.underlineStyle, value: NSUnderlineStyle.single.rawValue, range: nsRange)
|
|
}
|
|
|
|
attributedText = attributedString
|
|
|
|
// 添加点击手势
|
|
let tapGesture = UITapGestureRecognizer(target: self, action: #selector(handleTap(_:)))
|
|
addGestureRecognizer(tapGesture)
|
|
}
|
|
|
|
// MARK: - Actions
|
|
|
|
@objc private func handleTap(_ gesture: UITapGestureRecognizer) {
|
|
guard let text = self.text else { return }
|
|
|
|
let userAgreementText = YMLocalizedString("XPLoginViewController7")
|
|
let privacyPolicyText = YMLocalizedString("XPLoginViewController9")
|
|
|
|
let layoutManager = NSLayoutManager()
|
|
let textContainer = NSTextContainer(size: bounds.size)
|
|
let textStorage = NSTextStorage(attributedString: attributedText ?? NSAttributedString())
|
|
|
|
layoutManager.addTextContainer(textContainer)
|
|
textStorage.addLayoutManager(layoutManager)
|
|
|
|
textContainer.lineFragmentPadding = 0
|
|
textContainer.maximumNumberOfLines = numberOfLines
|
|
|
|
let locationOfTouchInLabel = gesture.location(in: self)
|
|
let textBoundingBox = layoutManager.usedRect(for: textContainer)
|
|
let textContainerOffset = CGPoint(x: (bounds.width - textBoundingBox.width) / 2,
|
|
y: (bounds.height - textBoundingBox.height) / 2)
|
|
let locationOfTouchInTextContainer = CGPoint(x: locationOfTouchInLabel.x - textContainerOffset.x,
|
|
y: locationOfTouchInLabel.y - textContainerOffset.y)
|
|
let indexOfCharacter = layoutManager.characterIndex(for: locationOfTouchInTextContainer,
|
|
in: textContainer,
|
|
fractionOfDistanceBetweenInsertionPoints: nil)
|
|
|
|
// 检查点击位置
|
|
if let userRange = text.range(of: userAgreementText) {
|
|
let nsRange = NSRange(userRange, in: text)
|
|
if NSLocationInRange(indexOfCharacter, nsRange) {
|
|
onUserAgreementTapped?()
|
|
return
|
|
}
|
|
}
|
|
|
|
if let privacyRange = text.range(of: privacyPolicyText) {
|
|
let nsRange = NSRange(privacyRange, in: text)
|
|
if NSLocationInRange(indexOfCharacter, nsRange) {
|
|
onPrivacyPolicyTapped?()
|
|
return
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|