// // EPProgressHUD.swift // YuMi // // Created by AI on 2025-10-11. // import UIKit import Foundation /// 带进度的 Loading 组件(基于 MBProgressHUD) @objc class EPProgressHUD: NSObject { private static var currentHUD: MBProgressHUD? /// 获取当前活跃的 window(兼容 iOS 13+) private static var keyWindow: UIWindow? { if #available(iOS 13.0, *) { return UIApplication.shared.connectedScenes .compactMap { $0 as? UIWindowScene } .flatMap { $0.windows } .first { $0.isKeyWindow } } else { return UIApplication.shared.keyWindow } } /// 显示上传进度 /// - Parameters: /// - uploaded: 已上传数量 /// - total: 总数量 @objc static func showProgress(_ uploaded: Int, total: Int) { DispatchQueue.main.async { guard let window = keyWindow else { return } if let hud = currentHUD { // 更新现有 HUD hud.label.text = String(format: YMLocalizedString("upload.progress_format"), uploaded, total) hud.progress = Float(uploaded) / Float(total) } else { // 创建新 HUD let hud = MBProgressHUD.showAdded(to: window, animated: true) hud.mode = .determinateHorizontalBar hud.label.text = String(format: YMLocalizedString("upload.progress_format"), uploaded, total) hud.progress = Float(uploaded) / Float(total) hud.removeFromSuperViewOnHide = true currentHUD = hud } } } /// 显示错误提示 /// - Parameter message: 错误信息 @objc static func showError(_ message: String) { DispatchQueue.main.async { guard let window = keyWindow else { return } let hud = MBProgressHUD.showAdded(to: window, animated: true) hud.mode = .text hud.label.text = message hud.label.numberOfLines = 0 hud.removeFromSuperViewOnHide = true hud.hide(animated: true, afterDelay: 2.0) } } /// 显示成功提示 /// - Parameter message: 成功信息 @objc static func showSuccess(_ message: String) { DispatchQueue.main.async { guard let window = keyWindow else { return } let hud = MBProgressHUD.showAdded(to: window, animated: true) hud.mode = .text hud.label.text = message hud.label.numberOfLines = 0 hud.removeFromSuperViewOnHide = true hud.hide(animated: true, afterDelay: 2.0) } } /// 关闭 HUD @objc static func dismiss() { DispatchQueue.main.async { guard let hud = currentHUD else { return } hud.hide(animated: true) currentHUD = nil } } }