//
// MBProgressHUD+extension.swift
// YouWen
//
// Created by liuyaqiang on 2020/11/20.
//
import UIKit
import MBProgressHUD
let HUD_Duration_Infinite = -1
let HUD_Duration_Normal = 1.5
let HUD_Duration_Short = 0.5
extension MBProgressHUD {
@discardableResult
class func showAdded(view: UIView, duration showTime: Double, animated: Bool) -> (MBProgressHUD) {
var animated = animated
let existHUD:MBProgressHUD = MBProgressHUD(view: view)
if existHUD != nil{
// 如果有HUD先隐藏掉,保证始终只有一个HUD
MBProgressHUD.hide(for: view, animated: false)
// 如果有HUD,则不做animation
animated = false
}
let showView = self.showAdded(to: view, animated: animated)
if Int(showTime) != HUD_Duration_Infinite {
DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + Double(Int64(showTime * Double(NSEC_PER_SEC))) / Double(NSEC_PER_SEC), execute: {
MBProgressHUD.hide(for: view, animated: false)
})
}
return showView
}
@discardableResult
class func showAdded(view: UIView, duration showTime: TimeInterval, withText text: String?, animated: Bool) -> (MBProgressHUD) {
let showView = self.showAdded(view: view, duration: showTime, animated: animated)
MBProgressHUD(view: view).isUserInteractionEnabled = false
MBProgressHUD(view: view).mode = .text
MBProgressHUD(view: view).label.text = text
return showView
}
@discardableResult
class func showAdded(view: UIView, icon image: UIImage?, duration showTime: TimeInterval, withText text: String?, animated: Bool) -> (MBProgressHUD) {
let showView = self.showAdded(view: view, duration: showTime, animated: animated)
MBProgressHUD(view: view).isUserInteractionEnabled = false
MBProgressHUD(view: view).mode = .customView
return showView
}
}
private let minHUDWidth: CGFloat = 0.0
extension UIViewController {
@discardableResult
func showWaitHUD() -> MBProgressHUD {
return showWaitHUD(title: "加载中…")
}
@discardableResult
func showWaitHUD(title: String?) -> MBProgressHUD {
let HUD = showHUD(title: title, duration: TimeInterval(HUD_Duration_Infinite))
HUD.isUserInteractionEnabled = true
return HUD
}
@discardableResult
func showHUDWithError(error: YWError) -> MBProgressHUD {
return showHUD(title: error.msg as String, duration: HUD_Duration_Normal)
}
@discardableResult
func showHUD(title: String?) -> MBProgressHUD {
return showHUD(title: title, duration: HUD_Duration_Normal)
}
@discardableResult
func showHUD(title: String?, detail: String?) -> MBProgressHUD {
return showHUD(title: title, detail: detail, duration: HUD_Duration_Normal)
}
@discardableResult
func showHUD(title: String?, duration: TimeInterval) -> MBProgressHUD {
return showHUD(title: "", detail: title, duration: duration)
}
@discardableResult
func showHUD(title: String?, detail: String?, duration: TimeInterval) -> MBProgressHUD {
var HUD:MBProgressHUD = MBProgressHUD()
if hudContainerView() != nil {
HUD = MBProgressHUD.showAdded(view: hudContainerView()!, duration: duration, withText: title, animated: true)
HUD.detailsLabel.text = detail
setHUDBelowNavigationBar()
HUD.minSize = CGSize(width: minHUDWidth, height: 0.0)
}
return HUD
}
@discardableResult
func showHUD(withTitle title: String?, detail: String?, topIcon iconImage: UIImage?, duration: TimeInterval) -> MBProgressHUD {
let HUD = showHUD(title: title, detail: detail, duration: duration)
HUD.mode = .customView
HUD.customView = UIImageView(image: iconImage)
return HUD
}
@discardableResult
func showHUD(withTitle title: String?, error: Error?) -> MBProgressHUD {
let errorDetail = error?.localizedDescription
return showHUD(title: title, detail: errorDetail)
}
func hideHUD() {
if hudContainerView() != nil {
MBProgressHUD.hide(for: hudContainerView()!, animated: true)
}
}
@discardableResult
func hudContainerView() -> UIView? {
if isViewLoaded {
if parent != nil && parent != navigationController {
return parent?.hudContainerView()
} else if navigationController?.parent != nil && navigationController?.parent != tabBarController {
return navigationController?.parent?.hudContainerView()
} else {
return view
}
} else {
return nil
}
}
func setHUDBelowNavigationBar() {
if navigationController?.view == hudContainerView() {
if let navigationBar = navigationController?.navigationBar {
if let hud = MBProgressHUD.forView((navigationController?.view)!) {
navigationController?.view.insertSubview(hud, belowSubview: navigationBar)
}
}
}
}
}
extension UIView {
@discardableResult
func showWaitHUD() -> MBProgressHUD {
return showWaitHUD(title: "加载中")
}
@discardableResult
func showHUDWithError(error: Error?) -> MBProgressHUD {
return showHUD(title: error?.localizedDescription, duration: HUD_Duration_Normal)
}
@discardableResult
func showWaitHUD(title: String?) -> MBProgressHUD {
let HUD = showHUD(title: "", detail: title, duration: TimeInterval(HUD_Duration_Infinite))
HUD.mode = .indeterminate
HUD.isUserInteractionEnabled = true
return HUD
}
@discardableResult
func showHUD(title: String?) -> MBProgressHUD {
return showHUD(title: title, duration: HUD_Duration_Normal)
}
@discardableResult
func showHUD(title: String?, detail: String?) -> MBProgressHUD {
return showHUD(title: title, detail: detail, duration: HUD_Duration_Normal)
}
@discardableResult
func showHUD(title: String?, duration: TimeInterval) -> MBProgressHUD {
return showHUD(title: "", detail: title, duration: HUD_Duration_Normal)
}
@discardableResult
func showHUD(title: String?, detail: String?, duration: TimeInterval) -> MBProgressHUD {
let HUD = MBProgressHUD.showAdded(view: self, duration: duration, withText: title, animated: true)
HUD.mode = .text
HUD.detailsLabel.text = detail
return HUD
}
@discardableResult
func showHUD(title: String, error: Error) -> MBProgressHUD {
let errorDetail = error.localizedDescription
return showHUD(title: title, detail: errorDetail)
}
@discardableResult
func showHUD(title: String, detail: String,iconImage: UIImage, duration: TimeInterval) -> MBProgressHUD {
let HUD = showHUD(title: title, detail: detail, duration: duration)
HUD.mode = .customView
HUD.customView = UIImageView(image: iconImage)
return HUD
}
func hideHUD() {
MBProgressHUD.hide(for: self, animated: true)
}
@discardableResult
func currentHUD() -> MBProgressHUD {
return MBProgressHUD(view: self)
}
}
网友评论