MBProgressHUD 1.2.0

MBProgressHUD 1.2.0

测试已测试
语言语言 Obj-CObjective C
许可证 MIT
发布最新版本2020年1月

Matej Bukovinski 维护。



  • 作者
  • Matej Bukovinski

MBProgressHUD 是一个用于 iOS 的即可用类,在后台线程中执行任务时,可以显示带指示器和/或标签的不透明 HUD。这个 HUD 的目的是作为未公开的私有 UIKit UIProgressHUD 的替代品,并提供一些额外功能。

注意:这个类最近经历了一次大规模的重写。旧版本可以在 遗留分支 中找到,如果您需要的话。

需求

MBProgressHUD 支持iOS 6以上版本,并且需要ARC来构建。它依赖于以下 Apple 框架,这些框架应该已经包含在大多数 Xcode 模板中

  • Foundation.framework
  • UIKit.framework
  • CoreGraphics.framework

要构建 MBProgressHUD,您需要最新的开发者工具。旧的 Xcode 版本可能也可以工作,但不会明确维护兼容性。

将 MBProgressHUD 添加到您的项目中

源文件

或者,您可以直接将 MBProgressHUD.hMBProgressHUD.m 源文件添加到您的项目中。

  1. 下载最新的代码版本 masterpiece.zip 或将存储库作为 git 子模块添加到您的 git 追踪项目中。
  2. 在 Xcode 中打开您的项目,然后将 MBProgressHUD.hMBProgressHUD.m 拖放到您的项目中(使用“Product Navigator 视图”)。如果在项目外部提取了代码存档,请确保选择复制项目。
  3. 使用 #import "MBProgressHUD.h" 在您需要 MBProgressHUD 的任何地方包含它。

静态库

您还可以将 MBProgressHUD 添加到您的项目中或 workspa

  1. 下载最新的代码版本 下载 或将存储库作为 git 子模块添加到您的 git 追踪项目中。
  2. 在 Xcode 中打开您的项目,然后将 MBProgressHUD.xcodeproj 拖放到您的项目或 workspace 中(使用“Product Navigator 视图”)。
  3. 选择您的目标,然后转到“构建阶段”选项卡。在“链接二进制与库”部分,点击添加按钮。在表单中查找并添加 libMBProgressHUD.a。您可能还需要将 MBProgressHUD 添加到“目标依赖项”列表中。
  4. 使用 #import <MBProgressHUD/MBProgressHUD.h> 在您需要 MBProgressHUD 的任何地方包含它。

使用方法

在处理MBProgressHUD并执行长时间运行的任务时,主要指南是保持主线程空闲,以便能够及时更新UI。因此,推荐在主线程上设置MBProgressHUD,然后将要执行的任务转移到新的线程。

[MBProgressHUD showHUDAddedTo:self.view animated:YES];
dispatch_async(dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_LOW, 0), ^{
    // Do something...
    dispatch_async(dispatch_get_main_queue(), ^{
        [MBProgressHUD hideHUDForView:self.view animated:YES];
    });
});

您可以在任何视图或窗口上添加HUD。但是,避免将HUD添加到具有复杂视图层次结构的某些UIKit视图,例如UITableViewUICollectionView,这是一个好主意。这些视图可能会以不可预料的方式更改其子视图,从而破坏HUD的显示。

如果您需要配置HUD,可以使用showHUDAddedTo:animated:返回的MBProgressHUD引用进行。

MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:self.view animated:YES];
hud.mode = MBProgressHUDModeAnnularDeterminate;
hud.labelText = @"Loading";
[self doSomethingInBackgroundWithProgressCallback:^(float progress) {
    hud.progress = progress;
} completionCallback:^{
    [hud hide:YES];
}];

您还可以使用NSProgress对象,当通过该对象报告进度时,MBProgressHUD会自动更新。

MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:self.view animated:YES];
hud.mode = MBProgressHUDModeAnnularDeterminate;
hud.labelText = @"Loading";
NSProgress *progress = [self doSomethingInBackgroundCompletion:^{
    [hud hide:YES];
}];
hud.progressObject = progress;

UI更新始终应在主线程上完成。但是,一些MBProgressHUD设置器被认为是“线程安全”的,可以从后台线程调用。这些还包括setMode:setCustomView:setLabelText:setLabelFont:setDetailsLabelText:setDetailsLabelFont:setProgress:

如果您需要在主线程上运行长时间运行的任务,应稍微延迟执行,这样UIKit就有足够的时间在阻塞主线程之前更新UI(即绘制HUD)。

[MBProgressHUD showHUDAddedTo:self.view animated:YES];
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, 0.01 * NSEC_PER_SEC);
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
    // Do something...
    [MBProgressHUD hideHUDForView:self.view animated:YES];
});

请注意,在上述块内部发出的任何HUD更新都不会在块完成之前显示。

有关更多示例,包括如何使用MBProgressHUD与异步操作(如NSURLConnection)一起使用,请参阅提供的示例项目。在头文件(MBProgressHUD.h)中提供了全面的API文档。

许可证

此代码依据MIT许可证的条款和条件进行分发。

变更日志

每个MBProgressHUD版本的简要总结可以在变更日志中找到。