// // MBManager.m // MBProgressDemo // // Created by hungryBoy on 16/1/23. // Copyright © 2016年 hungryBoy. All rights reserved. // #import "MBManager.h" #import "UIView+Toast.h" #import "XYloading.h" #define kScreen_height [[UIScreen mainScreen] bounds].size.height #define kWindow_W [[UIScreen mainScreen] bounds].size.width #define kDefaultRect CGRectMake(0, 0, kWindow_W, kScreen_height) #define kDefaultView [[UIApplication sharedApplication] keyWindow] #define kGloomyBlackColor [UIColor colorWithRed:0 green:0 blue:0 alpha:0.5] #define kGloomyClearCloler [UIColor colorWithRed:1 green:1 blue:1 alpha:0] /* 默认网络提示,可在这统一修改 */ static NSString *const kLoadingMessage = @"加载中..."; /* 默认简短提示语显示的时间,在这统一修改 */ static CGFloat const kShowTime = 2.0f; /* 手势是否可用,默认yes,轻触屏幕提示框隐藏 */ static BOOL isAvalibleTouch = YES; @implementation MBManager UIView *gloomyView;//深色背景 UIView *prestrainView;//预加载view BOOL isShowGloomy;//是否显示深色背景 #pragma mark - 类初始化 + (void)initialize { if (self == [MBManager self]) { //该方法只会走一次 [self customView]; } } #pragma mark - 初始化gloomyView +(void)customView { gloomyView = [[GloomyView alloc] initWithFrame:kDefaultRect]; gloomyView.backgroundColor = kGloomyBlackColor; gloomyView.hidden = YES; isShowGloomy = NO; } + (void)showGloomy:(BOOL)isShow { isShowGloomy = isShow; } #pragma mark - 简短提示语 + (void) showBriefAlert:(NSString *) message inView:(UIView *) view { [self showBriefAlert:message time:kShowTime inView:view isHerizotal:NO]; } + (void)showBriefAlert:(NSString *)message time:(NSInteger)showTime inView:(UIView *)view { [self showBriefAlert:message time:showTime inView:view isHerizotal:YES]; } + (void)showBriefAlert:(NSString *)message time:(NSInteger)showTime inView:(UIView *)view isHerizotal:(BOOL)isHerizontal { dispatch_async(dispatch_get_main_queue(), ^{ prestrainView = view; MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:view ?:kDefaultView animated:YES]; hud.detailsLabel.text = message; hud.detailsLabel.font = [UIFont systemFontOfSize:14]; // hud.animationType = MBProgressHUDAnimationZoom; hud.mode = MBProgressHUDModeText; hud.margin = 10.f; hud.removeFromSuperViewOnHide = YES; [hud hideAnimated:NO afterDelay:showTime]; if (isHerizontal) { hud.transform = CGAffineTransformMakeRotation(M_PI_2); } }); } #pragma mark - 长时间的提示语 + (void) showPermanentMessage:(NSString *)message inView:(UIView *) view{ dispatch_async(dispatch_get_main_queue(), ^{ prestrainView = view; gloomyView.frame = view ? CGRectMake(0, 0, view.frame.size.width, view.frame.size.height): kDefaultRect; MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:gloomyView animated:YES]; hud.label.text = message; [gloomyView addSubview:hud]; [self showClearGloomyView]; [hud showAnimated:YES]; }); } #pragma mark - 网络加载提示用 + (void) showLoadingInView:(UIView *) view{ dispatch_async(dispatch_get_main_queue(), ^{ prestrainView = view; MBProgressHUD *hud = [[MBProgressHUD alloc] initWithView:gloomyView]; hud.label.text = kLoadingMessage; hud.label.textColor =COLOR16(0x666666); hud.removeFromSuperViewOnHide = YES; gloomyView.frame = view ? CGRectMake(0, 0, view.frame.size.width, view.frame.size.height): kDefaultRect; if (isShowGloomy) { [self showBlackGloomyView]; }else { [self showClearGloomyView]; } [gloomyView addSubview:hud]; [hud showAnimated:YES]; }); } + (void)showWaitingWithTitle:(NSString *)title inView:(UIView *)view { dispatch_async(dispatch_get_main_queue(), ^{ prestrainView = view; MBProgressHUD *hud = [[MBProgressHUD alloc] initWithView:gloomyView]; hud.label.text = title; hud.removeFromSuperViewOnHide = YES; gloomyView.frame = view ? CGRectMake(0, 0, view.frame.size.width, view.frame.size.height): kDefaultRect; if (isShowGloomy) { [self showBlackGloomyView]; }else { [self showClearGloomyView]; } [gloomyView addSubview:hud]; [hud showAnimated:YES]; }); } + (void)showWaitingInView:(UIView *)view { dispatch_async(dispatch_get_main_queue(), ^{ MBProgressHUD *hudView = [MBManager HUDForView:gloomyView]; [hudView removeFromSuperview]; hudView = nil; prestrainView = view; MBProgressHUD *hud = [[MBProgressHUD alloc] initWithView:gloomyView]; hud.bezelView.style = MBProgressHUDBackgroundStyleSolidColor; hud.bezelView.color = UIColor.clearColor; hud.contentColor = [UIColor whiteColor];//将转圈和文字设置成白色 hud.removeFromSuperViewOnHide = YES; gloomyView.frame = view ? CGRectMake(0, 0, view.frame.size.width, view.frame.size.height): kDefaultRect; if (isShowGloomy) { [self showBlackGloomyView]; }else { [self showClearGloomyView]; } [gloomyView addSubview:hud]; [hud showAnimated:YES]; }); } +(void)showAlertWithCustomImage:(NSString *)imageName title:(NSString *)title inView:(UIView *)view{ dispatch_async(dispatch_get_main_queue(), ^{ prestrainView = view; gloomyView.frame = view ? CGRectMake(0, 0, view.frame.size.width, view.frame.size.height): kDefaultRect; MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:view ?:kDefaultView animated:YES]; UIImageView *littleView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 37, 37)]; littleView.image = [UIImage imageNamed:imageName]; hud.customView = littleView; hud.removeFromSuperViewOnHide = YES; // hud.animationType = MBProgressHUDAnimationZoom; hud.label.text = title; // hud.mode = MBProgressHUDModeCustomView; [hud showAnimated:YES]; [hud hideAnimated:YES afterDelay:kShowTime]; }); } #pragma mark - 加载在window上的提示框 +(void)showLoading { [self showLoadingInView:nil]; // [XYloading showWithStrings:@""]; } + (void)showWaitingWithTitle:(NSString *)title { [self showWaitingWithTitle:title inView:nil]; } +(void)showBriefAlert:(NSString *)alert { //[self showBriefAlert:alert inView:nil]; [[self currentViewController].view hideAllToasts]; if ([[self currentViewController] isKindOfClass:NSClassFromString(@"SPAlertController")] || [[self currentViewController] isKindOfClass:NSClassFromString(@"UIAlertController")]) { dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ [[self currentViewController].view makeToast:alert duration:1 position:CSToastPositionCenter]; }); } else { [[self currentViewController].view makeToast:alert duration:1 position:CSToastPositionCenter]; } } +(void)showPermanentAlert:(NSString *)alert{ [self showPermanentMessage:alert inView:nil]; } +(void)showAlertWithCustomImage:(NSString *)imageName title:(NSString *)title { [self showAlertWithCustomImage:imageName title:title inView:nil]; } + (void)showBriefAlert:(NSString *)message time:(NSInteger)showTime { [self showBriefAlert:message time:showTime inView:nil isHerizotal:YES]; } #pragma mark - GloomyView背景色 + (void)showBlackGloomyView { gloomyView.backgroundColor = kGloomyBlackColor; [self gloomyConfig]; } + (void)showClearGloomyView { gloomyView.backgroundColor = kGloomyClearCloler; dispatch_async(dispatch_get_main_queue(), ^{ [self gloomyConfig]; }); } #pragma mark - 决定GloomyView add到已给view或者window上 + (void)gloomyConfig { gloomyView.hidden = NO; gloomyView.alpha = 1; if (prestrainView) { [prestrainView addSubview:gloomyView]; }else { UIWindow *window = [UIApplication sharedApplication].keyWindow; if (![window.subviews containsObject:gloomyView]) { [window addSubview:gloomyView]; } } } #pragma mark - 隐藏提示框 +(void)hideAlert{ dispatch_async(dispatch_get_main_queue(), ^{ [XYloading dismiss]; MBProgressHUD *hud = [MBManager HUDForView:gloomyView]; #if 1 gloomyView.frame = CGRectZero; gloomyView.center = prestrainView ? prestrainView.center: [UIApplication sharedApplication].keyWindow.center; gloomyView.alpha = 0; [hud removeFromSuperview]; [gloomyView removeFromSuperview]; #else [UIView animateWithDuration:0.5 animations:^{ gloomyView.frame = CGRectZero; gloomyView.center = prestrainView ? prestrainView.center: [UIApplication sharedApplication].keyWindow.center; gloomyView.alpha = 0; hud.alpha = 0; } completion:^(BOOL finished) { [hud removeFromSuperview]; }]; #endif }); } + (void)showProgress:(float)progress { MBProgressHUD *hud = [[MBProgressHUD alloc] initWithView:gloomyView]; //MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:view ?:kDefaultView animated:YES]; // hud.bezelView.style = MBProgressHUDBackgroundStyleSolidColor; // hud.bezelView.color = kClearColor; // hud.contentColor = [UIColor whiteColor];//将转圈和文字设置成白色 hud.removeFromSuperViewOnHide = YES; hud.mode = MBProgressHUDModeAnnularDeterminate; hud.progress = progress; [hud showAnimated:YES]; } #pragma mark - 获取view上的hud + (MBProgressHUD *)HUDForView:(UIView *)view { NSEnumerator *subviewsEnum = [view.subviews reverseObjectEnumerator]; for (UIView *subview in subviewsEnum) { if ([subview isKindOfClass:[MBProgressHUD class]]) { return (MBProgressHUD *)subview; } } return nil; } + (UIView *)gloomyViewForManager { if (gloomyView) { return gloomyView; } return nil; } ////获取到根视图控制器 + (UIViewController *)currentViewController { UIWindow *keyWindow = [UIApplication sharedApplication].keyWindow; // modal展现方式的底层视图不同 UIViewController *rootViewController = keyWindow.rootViewController; UIViewController *currentVC = [self getCurrentVCFrom:rootViewController]; // if ([currentVC isKindOfClass:NSClassFromString(@"SPAlertController")]) { // return // } return currentVC; } + (UIViewController *)getCurrentVCFrom:(UIViewController *)rootVC { UIViewController *currentVC; if ([rootVC presentedViewController]) { // 视图是被presented出来的 rootVC = [rootVC presentedViewController]; } if ([rootVC isKindOfClass:[UITabBarController class]]) { // 根视图为UITabBarController currentVC = [self getCurrentVCFrom:[(UITabBarController *)rootVC selectedViewController]]; } else if ([rootVC isKindOfClass:[UINavigationController class]]) { // 根视图为UINavigationController currentVC = [self getCurrentVCFrom:[(UINavigationController *)rootVC visibleViewController]]; } else { // 根视图为非导航类 currentVC = rootVC; } return currentVC; } @end @implementation GloomyView -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{ if (isAvalibleTouch) { [MBManager hideAlert]; } } @end