MBProgressHUD是一个显示HUD窗口的第三方类库,用于在执行一些后台任务时,在程序中显示一个表示进度的loading视图和两个可选的文本提示的HUD窗口。MBProgressHUD 二次封装网上有很多教程,大多数我们在 MVC 模式下发送网络大多都在 UIVIewCOntroller 进行,需要使用弹窗的地方大多也都在controller 中,所有之前给 UIViewCOntroller 写了个分类,方便调用,但是后来觉得在基类中使用不太好,所以今天重新整理一下. demo 地址:https://github.com/SummerHH/YJMBProgressHUD.git

先了解下 MBProgressHUD 使用:

HUD窗口的模式:

// 使用UIActivityIndicatorView来显示进度,这是默认值
MBProgressHUDModeIndeterminate,
// 使用一个圆形饼图来作为进度视图
MBProgressHUDModeDeterminate,
// 使用一个水平进度条
MBProgressHUDModeDeterminateHorizontalBar,
// 使用圆环作为进度条
MBProgressHUDModeAnnularDeterminate,
// 显示一个自定义视图,通过这种方式,可以显示一个正确或错误的提示图
MBProgressHUDModeCustomView,
// 只显示文本
MBProgressHUDModeText

一个MBProgressHUD视图主要由四个部分组成:

1.标题文本

@property (strong, nonatomic, readonly) UILabel *label;

2.详情文本

@property (strong, nonatomic, readonly) UILabel *detailsLabel;

3.loading动画视图

@property (strong, nonatomic, nullable) UIView *customView;

4.HUD背景框

@property (strong, nonatomic, readonly) MBBackgroundView *bezelView;

外观属性:

设置颜色 默认为半半透明的黑色和白色的iOS 7和早iOS版本

@property (strong, nonatomic, nullable) UIColor *contentColor UI_APPEARANCE_SELECTOR;

//设置显示大小

@property (assign, nonatomic) CGSize minSize UI_APPEARANCE_SELECTOR;

//隐藏后从父视图中移除

@property (assign, nonatomic) BOOL removeFromSuperViewOnHide;

//是否显示蒙版,不过1.0.0版本被弃用了
@property (assign) BOOL dimBackground;

- (void)drawRect:(CGRect)rect {

    ...

    if (self.dimBackground) {

        //Gradient colours

        size_t gradLocationsNum = ;

        CGFloat gradLocations[] = {0.0f, 1.0f};

        CGFloat gradColors[] = {0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,0.75f}; 

        CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();

        CGGradientRef gradient = CGGradientCreateWithColorComponents(colorSpace, gradColors, gradLocations, gradLocationsNum);

        CGColorSpaceRelease(colorSpace);

        //Gradient center

        CGPoint gradCenter= CGPointMake(self.bounds.size.width/, self.bounds.size.height/);

        //Gradient radius

        float gradRadius = MIN(self.bounds.size.width , self.bounds.size.height) ;

        // 由中心向四周绘制渐变

        CGContextDrawRadialGradient (context, gradient, gradCenter,

                                     , gradCenter, gradRadius,

                                     kCGGradientDrawsAfterEndLocation);

        CGGradientRelease(gradient);

    }

    ... 

}

//创建布局

- (id)initWithView:(UIView *)view;

控制布局的属性

// HUD相对于父视图中心点的x轴偏移量和y轴偏移量

@property (assign) float xOffset;

@property (assign) float yOffset;

// HUD各元素与HUD边缘的间距

@property (assign) float margin;

// HUD背景框的最小大小

@property (assign) CGSize minSize;

// HUD的实际大小

@property (atomic, assign, readonly) CGSize size;

// 是否强制HUD背景框宽高相等

@property (assign, getter = isSquare) BOOL square;

//显示和隐藏的方法

- (void)showAnimated:(BOOL)animated;
- (void)hideAnimated:(BOOL)animated;

经常在 UIViewController 中使用,可以给 UIVIewController 写个分类

使用简单方便

#import <UIKit/UIKit.h>
#import "MBProgressHUD.h"
@interface UIViewController (HUD)
-(void)showSuccess:(NSString *)success;
-(void)showError:(NSString *)error;
-(void)showMessage:(NSString *)message;
-(void)showWaiting;
-(void)showLoading;
-(void)showLoadingWithMessage:(NSString *)message;
-(void)showSaving;
-(void)hideHUD;
@end
@implementation UIViewController (HUD)
-(void)showSuccess:(NSString *)success
{
MBProgressHUD *HUD=[[MBProgressHUD alloc]initWithView:[self getView]];
HUD.contentColor=[UIColor whiteColor];
HUD.bezelView.color=[UIColor blackColor];
HUD.mode=MBProgressHUDModeText;
HUD.label.text=success;
HUD.removeFromSuperViewOnHide=YES;
[[self getView] addSubview:HUD];
[HUD showAnimated:YES];
[HUD hideAnimated:YES afterDelay:];
}
-(void)showError:(NSString *)error
{
MBProgressHUD *HUD=[[MBProgressHUD alloc]initWithView:[self getView]];
HUD.contentColor=[UIColor whiteColor];
HUD.bezelView.color=[UIColor blackColor];
HUD.mode=MBProgressHUDModeText;
HUD.label.text=error;
HUD.removeFromSuperViewOnHide=YES;
[[self getView] addSubview:HUD];
[HUD showAnimated:YES];
[HUD hideAnimated:YES afterDelay:];
}
-(void)showMessage:(NSString *)message
{
MBProgressHUD *HUD=[[MBProgressHUD alloc]initWithView:[self getView]];
HUD.contentColor=[UIColor whiteColor];
HUD.bezelView.color=[UIColor blackColor];
HUD.mode=MBProgressHUDModeText;
HUD.label.text=message;
HUD.removeFromSuperViewOnHide=YES;
[[self getView] addSubview:HUD];
[HUD showAnimated:YES];
[HUD hideAnimated:YES afterDelay:];
}
-(void)showWaiting
{
MBProgressHUD *HUD=[[MBProgressHUD alloc]initWithView:[self getView]];
HUD.backgroundView.color = [UIColor colorWithWhite:.f alpha:.2f];
HUD.bezelView.color = [UIColor blackColor];
HUD.contentColor=[UIColor whiteColor];
HUD.removeFromSuperViewOnHide=YES;
[[self getView] addSubview:HUD];
[HUD showAnimated:YES];
}
-(void)showLoading
{
MBProgressHUD *HUD=[[MBProgressHUD alloc]initWithView:[self getView]];
HUD.backgroundView.color = [UIColor colorWithWhite:.f alpha:.2f];
HUD.bezelView.color = [UIColor blackColor];
HUD.contentColor=[UIColor whiteColor];
HUD.label.text=@"正在加载";
HUD.removeFromSuperViewOnHide=YES;
[[self getView] addSubview:HUD];
[HUD showAnimated:YES];
}
-(void)showLoadingWithMessage:(NSString *)message
{
MBProgressHUD *HUD=[[MBProgressHUD alloc]initWithView:[self getView]];
HUD.backgroundView.color = [UIColor colorWithWhite:.f alpha:.2f];
HUD.bezelView.color = [UIColor blackColor];
HUD.contentColor=[UIColor whiteColor];
HUD.label.text=message;
HUD.removeFromSuperViewOnHide=YES;
[[self getView] addSubview:HUD];
[HUD showAnimated:YES];
}
-(void)showSaving
{
MBProgressHUD *HUD=[[MBProgressHUD alloc]initWithView:[self getView]];
HUD.backgroundView.color = [UIColor colorWithWhite:.f alpha:.2f];
HUD.bezelView.color = [UIColor blackColor];
HUD.contentColor=[UIColor whiteColor];
HUD.label.text=@"正在保存";
HUD.removeFromSuperViewOnHide=YES;
[[self getView] addSubview:HUD];
[HUD showAnimated:YES];
}
-(void)hideHUD
{
[MBProgressHUD hideHUDForView:[self getView] animated:YES];
}
-(UIView *)getView
{
UIView *view;
if (self.navigationController.view) {
view=self.navigationController.view;
}else
{
view=self.view;
}
return view;
}

另一种可以配合网络使用,也可以 用在 Controller中

#import <MBProgressHUD/MBProgressHUD.h>

typedef NS_ENUM(NSInteger, YJProgressHUDStatus) {

    /** 成功 */
YJProgressHUDStatusSuccess, /** 失败 */
YJProgressHUDStatusError, /** 警告*/
YJProgressHUDStatusWaitting, /** 提示 */
YJProgressHUDStatusInfo, /** 等待 */
YJProgressHUDStatusLoading }; @interface YJProgressHUD : MBProgressHUD /**
* 是否正在显示
*/
@property (nonatomic, assign, getter=isShowNow) BOOL showNow; /** 返回一个 HUD 的单例 */
+ (instancetype)sharedHUD; /** 在 window 上添加一个 HUD */
+ (void)showStatus:(YJProgressHUDStatus)status text:(NSString *)text; #pragma mark - 建议使用的方法 /** 在 window 上添加一个只显示文字的 HUD */
+ (void)showMessage:(NSString *)text; /** 在 window 上添加一个提示`信息`的 HUD */
+ (void)showWaiting:(NSString *)text; /** 在 window 上添加一个提示`失败`的 HUD */
+ (void)showError:(NSString *)text; /** 在 window 上添加一个提示`成功`的 HUD */
+ (void)showSuccess:(NSString *)text; /** 在 window 上添加一个提示`等待`的 HUD, 需要手动关闭 */
+ (void)showLoading:(NSString *)text; /** 手动隐藏 HUD */
+ (void)hideHUD;
#import "YJProgressHUD.h"

// 背景视图的宽度/高度
#define BGVIEW_WIDTH 100.0f
// 文字大小
#define TEXT_SIZE 16.0f @implementation YJProgressHUD + (instancetype)sharedHUD {
static id hud;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
hud = [[self alloc] initWithView:[UIApplication sharedApplication].keyWindow];
});
return hud;
} + (void)showStatus:(YJProgressHUDStatus)status text:(NSString *)text { YJProgressHUD *HUD = [YJProgressHUD sharedHUD];
HUD.bezelView.color = [UIColor colorWithHex:0x000000];
HUD.contentColor=[UIColor whiteColor];
[HUD showAnimated:YES];
[HUD setShowNow:YES];
//蒙版显示 YES , NO 不显示
// HUD.dimBackground = YES;
HUD.label.text = text;
HUD.label.textColor = [UIColor whiteColor];
[HUD setRemoveFromSuperViewOnHide:YES];
HUD.label.font = [UIFont boldSystemFontOfSize:TEXT_SIZE];
[HUD setMinSize:CGSizeMake(BGVIEW_WIDTH, BGVIEW_WIDTH)];
[[UIApplication sharedApplication].keyWindow addSubview:HUD]; NSString *bundlePath = [[NSBundle mainBundle] pathForResource:@"YJProgressHUD" ofType:@"bundle"]; switch (status) { case YJProgressHUDStatusSuccess: { NSString *sucPath = [bundlePath stringByAppendingPathComponent:@"MBHUD_Success.png"];
UIImage *sucImage = [UIImage imageWithContentsOfFile:sucPath]; HUD.mode = MBProgressHUDModeCustomView;
UIImageView *sucView = [[UIImageView alloc] initWithImage:sucImage];
HUD.customView = sucView;
[HUD hideAnimated:YES afterDelay:2.0f]; dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0f * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
[HUD setShowNow:NO];
});
}
break; case YJProgressHUDStatusError: { NSString *errPath = [bundlePath stringByAppendingPathComponent:@"MBHUD_Error.png"];
UIImage *errImage = [UIImage imageWithContentsOfFile:errPath]; HUD.mode = MBProgressHUDModeCustomView;
UIImageView *errView = [[UIImageView alloc] initWithImage:errImage];
HUD.customView = errView;
[HUD hideAnimated:YES afterDelay:2.0f]; dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0f * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
[HUD setShowNow:NO];
});
}
break; case YJProgressHUDStatusLoading: {
HUD.mode = MBProgressHUDModeIndeterminate;
}
break; case YJProgressHUDStatusWaitting: {
NSString *infoPath = [bundlePath stringByAppendingPathComponent:@"MBHUD_Warn.png"];
UIImage *infoImage = [UIImage imageWithContentsOfFile:infoPath]; HUD.mode = MBProgressHUDModeCustomView;
UIImageView *infoView = [[UIImageView alloc] initWithImage:infoImage];
HUD.customView = infoView;
[HUD hideAnimated:YES afterDelay:2.0f]; dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0f * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
[HUD setShowNow:NO];
}); }
break; case YJProgressHUDStatusInfo: { NSString *infoPath = [bundlePath stringByAppendingPathComponent:@"MBHUD_Info.png"];
UIImage *infoImage = [UIImage imageWithContentsOfFile:infoPath]; HUD.mode = MBProgressHUDModeCustomView;
UIImageView *infoView = [[UIImageView alloc] initWithImage:infoImage];
HUD.customView = infoView;
[HUD hideAnimated:YES afterDelay:2.0f]; dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0f * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
[HUD setShowNow:NO];
});
}
break; default:
break;
}
} + (void)showMessage:(NSString *)text { YJProgressHUD *HUD = [YJProgressHUD sharedHUD];
HUD.bezelView.color = [UIColor colorWithHex:0x000000];
[HUD showAnimated:YES];
[HUD setShowNow:YES];
HUD.label.text = text;
HUD.contentColor=[UIColor whiteColor];
[HUD setMinSize:CGSizeZero];
[HUD setMode:MBProgressHUDModeText];
// HUD.dimBackground = YES;
[HUD setRemoveFromSuperViewOnHide:YES];
HUD.label.font = [UIFont boldSystemFontOfSize:TEXT_SIZE];
[[UIApplication sharedApplication].keyWindow addSubview:HUD]; dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0f * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
[[YJProgressHUD sharedHUD] setShowNow:NO];
[[YJProgressHUD sharedHUD] hideAnimated:YES];
});
} + (void)showWaiting:(NSString *)text { [self showStatus:YJProgressHUDStatusWaitting text:text];
} + (void)showError:(NSString *)text { [self showStatus:YJProgressHUDStatusError text:text];
} + (void)showSuccess:(NSString *)text { [self showStatus:YJProgressHUDStatusSuccess text:text];
} + (void)showLoading:(NSString *)text { [self showStatus:YJProgressHUDStatusLoading text:text];
} + (void)hideHUD { [[YJProgressHUD sharedHUD] setShowNow:NO];
[[YJProgressHUD sharedHUD] hideAnimated:YES];
}

效果图:

ios MBProgressHUD 使用,及二次封装的更多相关文章

  1. 对MBProgressHUD进行二次封装并精简使用

    对MBProgressHUD进行二次封装并精简使用 https://github.com/jdg/MBProgressHUD 几个效果图: 以下源码是MBProgressHUD支持最新的iOS8的版本 ...

  2. AFNetworking3.0+MBProgressHUD二次封装,一句话搞定网络提示

    对AFNetworking3.0+MBProgressHUD的二次封装,使用更方便,适用性非常强: 一句话搞定网络提示: 再也不用担心网络库更新后,工程要修改很多地方了!网络库更新了只需要更新这个封装 ...

  3. iOS项目相关@AFN&SDWeb的二次封装

    一,AFNetworking跟SDWebImge是功能强大且常用的第三方,然而在实际应用中需要封装用来复用今天就跟大家分享一下AFN&SDWeb的二次封装 1. HttpClient.h及.m ...

  4. iOS菜鸟之AFN的二次封装

    我用一个单例类将一些常用的网络请求进行了二次封装,主要包括post请求 get请求  图片文件上传下载  视频的断点续传等功能. 首先大家先去github上下载AFN,将文件夹内的AFNetworki ...

  5. 对百度WebUploader开源上传控件的二次封装,精简前端代码(两句代码搞定上传)

    前言 首先声明一下,我这个是对WebUploader开源上传控件的二次封装,底层还是WebUploader实现的,只是为了更简洁的使用他而已. 下面先介绍一下WebUploader 简介: WebUp ...

  6. AFNetworking二次封装的那些事

    AFNetworking可是iOS网络开发的神器,大大简便了操作.不过网络可是重中之重,不能只会用AFNetworking.我觉得网络开发首先要懂基本的理论,例如tcp/ip,http协议,之后要了解 ...

  7. 本地缓存下载文件,download的二次封装

    来源:http://ask.dcloud.net.cn/article/524 源码下载链接 说明: (1)由于平时项目中大量用到了附件下载等功能,所以就花了一个时间,把plus的downlaod进行 ...

  8. .Net Framework下对Dapper二次封装迁移到.Net Core2.0遇到的问题以及对Dapper的封装介绍

    今天成功把.Net Framework下使用Dapper进行封装的ORM成功迁移到.Net Core 2.0上,在迁移的过程中也遇到一些很有意思的问题,值得和大家分享一下.下面我会还原迁移的每一个过程 ...

  9. 代码二次封装-xUtils(android)

    通常我们会引用很多lib 而且会出现lib 与我们的功能仅仅差一点点 这种情况我们最好不要去改动源代码 而是进行二次封装 举例我使用 xUtils的二次封装 此处说明我是搞ios的 这个是androi ...

随机推荐

  1. linux命令-vim一般模式下复制剪切粘贴

    删除光标后的一个字符 x 删除光标前的一个字符 shift+x 删除指定个数的字符 数字+x 删除一行字符 dd 剪切指定行数  数字dd  3dd 剪切3行 其实并没有删掉而是保存着剪切板里 粘贴在 ...

  2. shell入门-变量

    shell变量分为系统变量和用户自定义变量 查看变量的命令 #env        系统变量 或者 #set    包括env和自定义变量和额外变量 使用变量的命令是 #echo $[变量] //// ...

  3. 03_android日志猫的使用

    在java基础的时候如果想调试程序打一下日志,用的是System.out.println();. 控制台输出的其实不是咱们的日志,而是我把整个项目的部署到设备上.控制台输出的是这个东西.Uploadi ...

  4. JDBC编程之程序优化

    -----------------siwuxie095 首先下载 MySQL 的 JDBC 驱动,下载链接: https://dev.mysql.com/downloads/connector/j/ ...

  5. assert.ok()

    测试 value 是否为真值. 相当于 assert.equal(!!value, true, message). 如果 value 不为真值,则抛出一个带有 message 属性的 Assertio ...

  6. Java Synchronized的原理

    我们先通过反编译下面的代码来看看Synchronized是如何实现对代码块进行同步的: public class SynchronizedDemo{ public void method(){ syn ...

  7. C#中读写自定义的web 配置文件

    开发程序的过程中,有时候我们需要自己编写一个config文件,比如取名App.config, 然后写一些配置信息在里面.然后我们需要编写C#代码来对这个配置文件进行读写 比如:App.Config & ...

  8. Sharepoint2013商务智能学习笔记之简单概述(一)

    SharePoint 2013 中的商业智能 (BI) 提供集 Microsoft Office 应用程序和其他 Microsoft 技术于一体的全面的 BI 工具.这些 BI 工具有:Excel 2 ...

  9. pandas中df.ix, df.loc, df.iloc 的使用场景以及区别

    pandas中df.ix, df.loc, df.iloc 的使用场景以及区别: https://stackoverflow.com/questions/31593201/pandas-iloc-vs ...

  10. [hdu 1671] Phone List - Trie

    Given a list of phone numbers, determine if it is consistent in the sense that no number is the pref ...