HKProgressHUD
是一个纯 Swift 的 iOS 滴入类,在后台线程执行工作时,它会在 UI 上显示半透明的 HUD,带有指示器和/或标签。这个 HUD 设计用来替换未被官方文档记载的私有:UIKit
的 UIProgressHUD
,并且增加了一些额外的功能。本项目高度模仿了流行的 MBProgressHUD。
HKProgressHUD
适用于 iOS 8+。您需要最新的开发者工具来构建 HKProgressHUD
。旧版的 Xcode 可能可用,但将不明确维护兼容性。
您可以另外直接将 HKProgressHUD.swift
和 ProgressView.swift
源文件添加到您的项目中。
当您在处理长任务时与 HKProgressHUD 相关的主要指导原则是保持主线程无负载,以便 UI 可以迅速更新。因此,使用 HKProgressHUD 的推荐方式是在主线程上设置它,然后将您要执行的任务在新线程上执行。
let hud = HKProgressHUD.show(addedToView: self.view, animated: true)
DispatchQueue.global(qos: .userInitiated).async {
// Do something...
DispatchQueue.main.async {
hud.hide(animated: true)
}
}
您可以在任何视图或窗口上添加 HUD。然而,避免在某些具有复杂视图层次结构(如 UITableView
或 UICollectionView
)的 UIKit
视图中添加 HUD 是一个好主意。这些视图可能会以意想不到的方式更改其子视图,从而损坏 HUD 的显示。
如果您需要配置 HUD,可以使用 show(addedToView:animated:) 返回的 HKProgressHUD 引用来完成。
let hud = HKProgressHUD.show(addedToView: (self.navigationController?.view)!, animated: true)
hud.mode = .annularDeterminate
hud.label?.text = "Loading..."
DispatchQueue.global(qos: .userInitiated).async {
// Do something...
DispatchQueue.main.async {
hud.hide(animated: true)
}
}
您还可以使用 Progress
对象,当通过该对象报告进度时,HKProgressHUD 将会更新自身。
let hud = HKProgressHUD.show(addedToView: (self.navigationController?.view)!, animated: true)
hud.mode = .annularDeterminate
hud.label?.text = "Loading..."
let progress = Progress(totalUnitCount: 100)
hud.progressObject = progress;
UI 更新始终应该在新线程上执行。
如果您需要在主线程上运行长任务,应该稍作延迟执行,这样 UIKit 就有足够的时间更新 UI(即绘制 HUD),在您阻塞主线程之前。
HKProgressHUD.show(addedToView: self.view, animated: true)
DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + DispatchTimeInterval.seconds(3), execute: {
// Do something...
HKProgressHUD.hide(addedToView: self.view, animated: false)
})
请注意,在上述块内部发布的任何HUD更新都不会在块完成前显示。
有关更多示例,包括如何使用HKProgressHUD与异步操作如NSURLConnection一起使用,请查看所包含的示例项目。
此代码根据MIT许可证的条款和条件分发。
每个HKProgressHUD发布的简要总结可以在CHANGELOG中找到。