SVProgressHUD
已经很强大,那么为什么又要重复造这个轮子?
因为样式在美工眼中不好看、层级操作不符合自己的需求、造起来更简单呀。
效果图
显示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资源
关闭按钮
HUD的duration
设置为-1
时,HUD会一直显示。为了防止出现逻辑BUG因此影响用户的操作。当duration
为-1
时会默认在右上角添加一个关闭按钮,该按钮可以让用户自己决定是否需要关闭HUD。如果您不需要该功能,可以设置isShowCloseButton
为false
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
版权属于:东哥笔记 - DongGe.org
本文链接:https://dongge.org/blog/1178.html
自2017年12月26日起,『转载以及大段采集进行后续编辑』须注明本文标题和链接!否则禁止所有转载和采集行为!