SVProgressHUD已经很强大,那么为什么又要重复造这个轮子?

因为样式在美工眼中不好看、层级操作不符合自己的需求、造起来更简单呀。

效果图

demo.gif

显示HUD

//显示HUD
static func show(_ content: String? = nil, icon: HDHUDIconType = .none, direction: HDHUDContentDirection = .horizontal, duration: TimeInterval = 2.5, superView: UIView? = nil, mask: Bool = true, priority: HDHUDPriority = .high, didAppear: (()->Void)? = nil, completion: (()->Void)? = nil) -> HDHUDTask

//显示进度HUD
static func showProgress(_ progress: Float, direction: HDHUDContentDirection = .horizontal, superView: UIView? = nil, mask: Bool = true, priority: HDHUDPriority = .high, didAppear: (()->Void)? = nil, completion: (()->Void)? = nil) -> HDHUDProgressTask

//显示自定义view
static func show(customView: UIView, duration: TimeInterval = 2.5, superView: UIView? = nil, mask: Bool = true, priority: HDHUDPriority = .high, didAppear: (()->Void)? = nil, completion: (()->Void)? = nil) -> HDHUDTask

显示是上面这个函数,所有参数都已经默认值,可以通过不同的参数展示不同的样式,例如下面这样

HDHUD.show("Text Information", icon: .warn, direction: .vertical, duration: 3.0, superView: self.view, mask: true, priority: .high) {
       //Automatically closed callback
}

//纯文本展示
HDHUD.show("纯文本展示")

//只显示图标
HDHUD.show(icon: .loading)

content指定显示的弹窗内容

icon指定图标的样式,分别代表无图标、成功、失败、警告、loading

direction可以指定图标和文字内容的排列方向,默认横向排列,也可以设置为纵向排列

duration指定自定消失时间,如果传-1将会一直显示,不过正常情况下提示之后自动消失即可

superView默认是当前的window窗口,如果你想绑定某个vc的视图,可以传入,这样会随着superView的销毁而销毁,不会因为界面冲突

mask设置弹层以下的视图是否可以点击,当弹层出现时,默认会有一层遮罩,你可以选择遮罩以下的视图是否响应点击事件

priority弹层优先级,这个就是日常使用很方便的功能,提供了以下四个选项

public enum HDHUDPriority {
    case low
    case overlay
    case high
    case sequence
}

如果当前没有toast在显示这四个选项是无效的,当已有toast在显示状态,而新的toast也已经调用了显示,则会根据以下优先级逻辑进行显示

  • low 已有toast在显示的情况下,该条提示不显示,优先级最低
  • overlay 该提示和当前在展示的toast同时叠加显示,两个提示会重叠
  • high 关闭当前正在展示的toast,立即展示准备显示的toast,默认选项,如果多个toast的话,可能会有的toast还没显示就已经隐藏了,这个是大多数HUD组件的逻辑
  • sequence 当前展示的toast结束之后,展示本条即将显示的toast,添加到序列,保证每条提示都可以显示出来,如果太多toast的话,可能会让用户等待时间比较久

didAppear HUD显示之后的回调

completion HUD消失之后的回调

进度HUD

进度做了单独的优化,不必隐藏再显示

//获取进度弹窗任务
let task = HDHUD.showProgress(0.1, direction: .vertical, priority: priority)

//更新进度
task.progress = 0.3

自定义view

预留了展示自定义view的功能,可以展示自己写的view

HDHUD.show(customView: customView)

注意:自己的view需要设置大小的约束,可以使用SnapKit设置,例如

//自定义视图使用snapkit布局
lazy var mCustomView2: UIView = {
     let view = UIView()
     //设置大小
     view.snp.makeConstraints { (make) in
           make.width.equalTo(200)
           make.height.equalTo(100)
     }
     return view
}()

//显示
HDHUD.show(commonView: mCustomView2)

也可以直接使用frame设置

lazy var mCustomView: UIView = {
     let view = UIView(frame: CGRect(x: 0, y: 0, width: 200, height: 100))
     return view
}()

//显示
HDHUD.show(commonView: mCustomView)

隐藏HUD

如果待展示序列中还有其他HUD,会继续展示下一个

//隐藏当前HUD
HDHUD.hide()

//隐藏指定的HUD
let task = HDHUD.show("竖版排列")
HDHUD.hide(task: task)

清空所有HUD,包括序列中未展示HUD

//清空所有HUD,completeValid设置当task被清理时,是否发出task的completion回调,默认不发出
static func clearAll(completeValid: Bool = false) {}

//例如
HDHUD.clearAll()

自定义配置

提供了很多可以自定义的选项,可以很方便的配置背景颜色、弹窗颜色、文字颜色等等

open class HDHUD {
    ///images
    public static var warnImage = UIImageHDBoundle(named: "ic_warning")
    public static var warnImageSize = CGSize(width: 24, height: 24)
    public static var errorImage = UIImageHDBoundle(named: "ic_error")
    public static var errorImageSize = CGSize(width: 24, height: 24)
    public static var successImage = UIImageHDBoundle(named: "ic_success")
    public static var successImageSize = CGSize(width: 24, height: 24)
    public static var loadingImage = getLoadingImage()
    public static var loadingImageSize = CGSize(width: 48, height: 48)
    #if canImport(Kingfisher)
    //如果设置了`loadingImageURL`,加载图片将会优先使用URL资源
    // If `loadingImageURL` is set, the URL resource will be used preferentially when loading images
    public static var loadingImageURL: URL? = URL(fileURLWithPath: URLPathHDBoundle(named: "loading.gif") ?? "")
    #endif
    ///color and text
    public static var contentBackgroundColor = UIColor.zx.color(hexValue: 0x000000, alpha: 0.8)
    public static var backgroundColor = UIColor.zx.color(hexValue: 0x000000, alpha: 0.3) {
        willSet {
            self.bgView.backgroundColor = newValue
        }
    }
    public static var textColor = UIColor.zx.color(hexValue: 0xFFFFFF)
    public static var textFont = UIFont.systemFont(ofSize: 16)
    public static var contentOffset = CGPoint.zero
    public static var progressTintColor = UIColor.zx.color(hexValue: 0xFF8F0C)
    public static var trackTintColor = UIColor.zx.color(hexValue: 0xFFFFFF)
}

特别说明的是loading图标默认用的image系统提供的循环方式UIImage.animatedImage(with: imageList, duration: 0.6),如果你想使用gif图片,可以集成

pod "HDHUD/gif"

导入之后,设置HDHUD.loadingImageURL即可,如果设置了loadingImageURL,加载图片将会优先使用URL资源

关闭按钮

demo.png

HUD的duration设置为-1时,HUD会一直显示。为了防止出现逻辑BUG因此影响用户的操作。当duration-1时会默认在右上角添加一个关闭按钮,该按钮可以让用户自己决定是否需要关闭HUD。如果您不需要该功能,可以设置isShowCloseButtonfalse

HDHUD.isShowCloseButton = false

特点

简单易用,通过不同的参数,实现不同的展示效果

  • 纯文本展示
  • 带icon展示,icon和图片的位置支持自定义
  • 进度条展示
  • loading展示
  • 自适应文本大小
  • 多个弹窗序列展示、重叠展示、优先级展示
  • 指定关闭序列内未展示的弹窗

集成

使用cocoapods进行集成

pod "HDHUD"

1.3.6 -> 2.0.0的破坏更新

  • 参数userInteractionOnUnderlyingViewsEnabled更改为mask,含义相反,mask表示遮罩层以下的view不响应点击事件,默认值为false
  • 参数名autoAddCloseButton 更改为 isShowCloseButton

项目地址

github: https://github.com/DamonHu/HDHUD

Last modification:September 17th, 2021 at 11:33 am
如果觉得我的文章对你有用,请随意打赏: ☞已打赏列表