ios MBProgressHUD 使用,及二次封装

https://www.cnblogs.com/ningmengcao-ios/p/6698893.html

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 (strongnonatomicreadonlyUILabel *label;

2.详情文本

@property (strongnonatomicreadonlyUILabel *detailsLabel;

3.loading动画视图

@property (strongnonatomicnullableUIView *customView;

4.HUD背景框

@property (strongnonatomicreadonlyMBBackgroundView *bezelView;

 

 

外观属性:

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

@property (strongnonatomicnullableUIColor *contentColor UI_APPEARANCE_SELECTOR;

//设置显示大小

@property (assignnonatomicCGSize minSize UI_APPEARANCE_SELECTOR;

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

@property (assignnonatomicBOOL 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];

        }

posted @ 2018-09-21 10:12  sundaysios  阅读(774)  评论(0)    收藏  举报