ios MBProgressHUD 使用,及二次封装
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 = 2; CGFloat gradLocations[2] = {0.0f, 1.0f}; CGFloat gradColors[8] = {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/2, self.bounds.size.height/2); //Gradient radius float gradRadius = MIN(self.bounds.size.width , self.bounds.size.height) ; // 由中心向四周绘制渐变 CGContextDrawRadialGradient (context, gradient, gradCenter, 0, 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:1]; } -(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:1]; } -(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:1]; } -(void)showWaiting { MBProgressHUD *HUD=[[MBProgressHUD alloc]initWithView:[self getView]]; HUD.backgroundView.color = [UIColor colorWithWhite:0.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:0.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:0.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:0.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]; }
效果图: