146 lines
3.7 KiB
Swift
146 lines
3.7 KiB
Swift
//
|
|
// HUDTool.swift
|
|
// yinmeng-ios
|
|
//
|
|
// Created by yinmeng on 2024/2/23.
|
|
//
|
|
|
|
import Foundation
|
|
import MBProgressHUD
|
|
|
|
class HUDTool: NSObject {
|
|
|
|
static var currentHud : MBProgressHUD?
|
|
|
|
private static let kDelayTime: TimeInterval = 2
|
|
|
|
/** 隐藏HUD*/
|
|
class func hidden(_ time:TimeInterval = 0){
|
|
guard let HUD = currentHud else {
|
|
return
|
|
}
|
|
HUD.hide(animated: false)
|
|
currentHud = nil
|
|
}
|
|
|
|
/**
|
|
显示成功message
|
|
|
|
- Parameter message: 文字
|
|
- Parameter view: 显示在哪个view上
|
|
- Parameter afterDelay: 延迟消失时间
|
|
- Parameter enabled: 是否可以拦截事件 no:不拦截 yes:拦截
|
|
*/
|
|
class func show(with message: String, in view: UIView? = YMRequestX.topViewController()?.view, delay afterDelay: TimeInterval = kDelayTime, enabled: Bool = true, icon:String = "") {
|
|
if message.isEmpty { return }
|
|
|
|
DispatchQueue.main.async {
|
|
hidden(0)
|
|
var view = view
|
|
if view == nil {
|
|
view = YMRequestX.topViewController()?.view ?? YMRequestX.keyWindow()
|
|
}
|
|
if let view = view {
|
|
let hud = normalProgressHUD(in: view)
|
|
currentHud = hud
|
|
hud.isUserInteractionEnabled = enabled
|
|
hud.mode = .customView
|
|
hud.bezelView.style = .solidColor
|
|
hud.margin = 8
|
|
hud.backgroundColor = .clear
|
|
hud.removeFromSuperViewOnHide = true
|
|
|
|
let messageView = HudMessageView()
|
|
messageView.titleLb.text = message
|
|
|
|
let maxWidth = 242.0
|
|
let size = message.boundingRect(with: CGSize(width: maxWidth, height: CGFLOAT_MAX), font: UIFont.systemFont(ofSize: 14, weight: .medium), lineSpacing: 6)
|
|
var width = size.width + 5
|
|
var height = size.height
|
|
if icon.count > 0 {
|
|
messageView.logoImgView.image = UIImage(named: icon)
|
|
messageView.logoImgView.isHidden = false
|
|
width += 22.0
|
|
} else {
|
|
messageView.logoImgView.isHidden = true
|
|
}
|
|
|
|
hud.bezelView.backgroundColor = ThemeColor(hexStr: "#000000", alpha: 0.7)
|
|
hud.bezelView.layer.cornerRadius = 8
|
|
hud.bezelView.layer.masksToBounds = true
|
|
hud.bezelView.addSubview(messageView)
|
|
|
|
messageView.snp.makeConstraints { make in
|
|
make.height.equalTo(height)
|
|
make.width.equalTo(width)
|
|
make.center.equalTo(hud.bezelView)
|
|
}
|
|
hud.minSize = CGSize(width: width + 40, height: height + 24)
|
|
hud.show(animated: true)
|
|
hud.hide(animated: false, afterDelay: kDelayTime)
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
private class func normalProgressHUD(in view: UIView) -> MBProgressHUD {
|
|
let hud = MBProgressHUD.showAdded(to: view, animated: true)
|
|
hud.mode = .indeterminate
|
|
hud.bezelView.style = .solidColor
|
|
hud.margin = 8
|
|
// 方框背景颜色
|
|
hud.bezelView.color = UIColor.black.withAlphaComponent(0.8)
|
|
return hud
|
|
}
|
|
}
|
|
|
|
|
|
class HudMessageView: UIView {
|
|
override init(frame: CGRect) {
|
|
super.init(frame: frame)
|
|
self.addSubview(stackView)
|
|
stackView.addArrangedSubview(logoImgView)
|
|
stackView.addArrangedSubview(titleLb)
|
|
|
|
stackView.snp.makeConstraints { make in
|
|
make.edges.equalTo(self)
|
|
}
|
|
|
|
logoImgView.snp.makeConstraints { make in
|
|
make.size.equalTo(CGSize(width: 20, height: 20))
|
|
}
|
|
}
|
|
|
|
required init?(coder: NSCoder) {
|
|
fatalError("init(coder:) has not been implemented")
|
|
}
|
|
|
|
private lazy var stackView: UIStackView = {
|
|
let stackView = UIStackView()
|
|
stackView.distribution = .fill
|
|
stackView.axis = .horizontal
|
|
stackView.alignment = .top
|
|
stackView.spacing = 2
|
|
return stackView
|
|
}()
|
|
|
|
lazy var logoImgView: UIImageView = {
|
|
let imageView = UIImageView()
|
|
imageView.isUserInteractionEnabled = true
|
|
imageView.layer.masksToBounds = true
|
|
imageView.contentMode = .scaleAspectFill
|
|
return imageView
|
|
}()
|
|
|
|
lazy var titleLb: UILabel = {
|
|
let label = UILabel()
|
|
label.textColor = UIColor.white
|
|
label.font = UIFont.systemFont(ofSize: 14, weight: .medium)
|
|
label.textAlignment = .center
|
|
label.numberOfLines = 0
|
|
return label
|
|
}()
|
|
|
|
|
|
}
|