ProgressHUD

1. MBProgressHUD

项目中经常会用到MBProgressHUD,升级到1.0版本后,很多属性发生了变化,demo提供的示例也几乎全用GCD的写法,代码显得更加简明紧凑。认真看了一下,收获颇丰。

#import "ViewController.h"
#import <MBProgressHUD.h>

@interface ViewController ()
@property (nonatomic,assign) BOOL isCancel;
@end


- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
    
    MBProgressHUD *hud =[MBProgressHUD showHUDAddedTo:self.view animated:YES];

    hud.bezelView.alpha = 0.8;   //背景框透明度,默认为0.8
    hud.bezelView.color = [UIColor grayColor]; //背景框颜色
    hud.bezelView.layer.cornerRadius = 10;//背景框圆角,默认是10;
    
    hud.backgroundView.style = MBProgressHUDBackgroundStyleBlur;//背景模糊
    
    //hud.activityIndicatorColor = [UIColor redColor];//菊花颜色,废弃但有效
    
    hud.label.text = @"loading...";
    hud.label.textColor = [UIColor redColor];//提示字体颜色
    hud.label.font = [UIFont systemFontOfSize:13];//详情字体
    
    hud.detailsLabel.text = @"LoadingLoading...";
    hud.detailsLabel.textColor = [UIColor blueColor];//详情字体颜色
    hud.detailsLabel.font = [UIFont systemFontOfSize:13];//详情字体
    
    //hud.xOffset = 0;
    //hud.yOffset = -20;//提示框相对于父视图的偏移量
    hud.offset = CGPointMake(0, 20);
    hud.minSize = CGSizeMake(50, 50);//设置背景框最小尺寸,实际大小为readonly
    
    hud.margin = 5;//设置各元素距离矩形边框的距离
    hud.square = NO;//强制背景框为正方形
    hud.removeFromSuperViewOnHide = YES;//隐藏时从父视图删除
    
    //1.0后最大变化也许就是新增button属性
    [hud.button setTitle:@"cancel" forState:UIControlStateNormal];
    [hud.button addTarget:self action:@selector(go) forControlEvents:UIControlEventTouchUpInside];
    
    //进度条
    hud.mode = MBProgressHUDModeAnnularDeterminate;
    //    HUD.mode = MBProgressHUDModeIndeterminate;//菊花,默认值
    //    HUD.mode = MBProgressHUDModeDeterminate;//饼状图
    //    HUD.mode = MBProgressHUDModeDeterminateHorizontalBar;//进度条
    //    HUD.mode = MBProgressHUDModeAnnularDeterminate;//圆环作为进度条
    //    HUD.mode = MBProgressHUDModeCustomView; //需要设置自定义视图时候设置成这个
    //    HUD.mode = MBProgressHUDModeText; //只显示文本

     //1.0后几乎全是这种写法,必须保证HUD在主线程
    dispatch_async(dispatch_get_global_queue(0, 0), ^{
        [self dosomething];
        dispatch_async(dispatch_get_main_queue(), ^{
            hud.hidden = YES;
        });
    });
   
}
//
- (void)go{
    self.isCancel = YES;
}
- (void)dosomething{
    
    self.isCancel = NO;
    float progress = 0.0f;
    while (progress < 1.0f) {
        
        if (self.isCancel) return;
        progress += 0.01f;
        dispatch_async(dispatch_get_main_queue(), ^{
            
            [MBProgressHUD HUDForView:self.view].progress = progress;
        });
        usleep(50000);//微秒,千分之一毫秒
    }
    
}

2. DACircularProgress

DACircularProgress 是一个专做做环形进度条的第三方框架,使用起来也是十分的方便。

//懒加载
- (DACircularProgressView*)progressView{
    if (!_progressView) {
        _progressView = [[DACircularProgressView alloc]initWithFrame:CGRectMake(0, 0, 40, 40)];
        _progressView.center = self.view.center;
        _progressView.roundedCorners = YES;
        _progressView.progressTintColor = [UIColor darkGrayColor];
        _progressView.trackTintColor = [UIColor lightGrayColor];
        
    }
    return _progressView;
}

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{

    [self.view addSubview:self.progressView];
        dispatch_async(dispatch_get_global_queue(0, 0), ^{
            [self dosomething];
            dispatch_async(dispatch_get_main_queue(), ^{
                self.progressView.hidden = YES;
                [self.progressView removeFromSuperview];
                self.progressView = nil;
            });
        });
}
- (void)dosomething{
    
    float progress = 0.0f;
    while (progress < 1.0f) {
        
        progress += 0.01f;
        =====对界面进行刷新全部使用主线程========
        dispatch_async(dispatch_get_main_queue(), ^{
            self.progressView.progress = progress;
        });
        usleep(50000);//微秒,千分之一毫秒
    }    
}

DACircularProgress 还有一个子类,在加载圈中间显示进度

- (DALabeledCircularProgressView*)labeledProgressView{
    if (!_labeledProgressView) {
        _labeledProgressView = [[DALabeledCircularProgressView alloc]initWithFrame:CGRectMake(0, 0, 40, 40)];
        _labeledProgressView.roundedCorners = YES;
        _labeledProgressView.center = self.view.center;
    }
    return _labeledProgressView;
}
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{

       [self.view addSubview:self.labeledProgressView];
        dispatch_async(dispatch_get_global_queue(0, 0), ^{
            [self dosomething];
            dispatch_async(dispatch_get_main_queue(), ^{
                self.labeledProgressView.hidden = YES;
            });
        });
}

3. SVProgressHUD

SVProgressHUD 是另一款易用的进度框架,由于其单例 设计,不用每次初始化,大多方法是加号方法。进度条都需要注意的是刷新UI一定要在主线程中进行,并且示例代码中也几乎全是用GCD在处理线程。

- (void)go{
    
//    [SVProgressHUD show];
//    [SVProgressHUD showWithStatus:@"我爱你"];
//    [SVProgressHUD showSuccessWithStatus:@"我爱你"];
//    [SVProgressHUD showInfoWithStatus:@"我爱你吗"];
//    [SVProgressHUD showErrorWithStatus:@"我不爱你"];
    [SVProgressHUD showProgress:0 ];
    dispatch_async(dispatch_get_global_queue(0, 0), ^{
        // time-consuming task
        [self doSomeThing];
        dispatch_async(dispatch_get_main_queue(), ^{
            [SVProgressHUD dismiss];
        });
    });

}
- (void)doSomeThing{
    
    CGFloat progress = 0.0;
    while (progress < 1.0) {
        
        dispatch_async(dispatch_get_main_queue(), ^{
           
            [SVProgressHUD showProgress:progress status:[NSString stringWithFormat:@"%.2f%%",progress]];
            if (progress > 1.0) {
                return ;
            }
        });
        
    }
   
}

4. JHUD

除了简单的效果,JHUD 可以使用图片数组,或gif 图快速的自定义ProrgerssView

//源码中建议写成懒加载
 self.hudView = [[JHUD alloc]initWithFrame:self.view.bounds];
 //self.hudView.indicatorBackGroundColor = [[UIColor greenColor] colorWithAlphaComponent:0.1];
// self.hudView.indicatorForegroundColor = [UIColor redColor];
  
 //类型为JHUDLoadingTypeFailure时,设置的回调方法  
 typeof(self) weakself = self;
 [self.hudView setJHUDReloadButtonClickedBlock:^{
        [weakself go];
    }];

JHUD 共5种类型

    //hudType:
    //JHUDLoadingTypeCircle           = 0,
    //JHUDLoadingTypeCircleJoin       = 1,
    //JHUDLoadingTypeDot              = 2,

    self.hudView.messageLabel.text = @"Hello ,this is a circle animation";
    [self.hudView showAtView:self.view hudType:JHUDLoadingTypeCircleJoin];
    
  
    //JHUDLoadingTypeCustomAnimations = 3,

    NSMutableArray *arr = [NSMutableArray array];
    for (int i = 0; i < 2; i++) {
        UIImage *image = [UIImage imageNamed:[NSString stringWithFormat:@"%d.jpg",i]];
        [arr addObject:image];
    }
    self.hudView.indicatorViewSize = CGSizeMake(60, 60);
    self.hudView.customAnimationImages = arr;
    self.hudView.messageLabel.text = @"Hello ,this is a circle animation";
    [self.hudView showAtView:self.view hudType:JHUDLoadingTypeCustomAnimations];
    
    //JHUDLoadingTypeGifImage         = 4,

    NSString *path = [[NSBundle mainBundle] pathForResource:@"loadinggif3" ofType:@"gif"];
    NSData *data = [NSData dataWithContentsOfFile:path];
    self.hudView.gifImageData = data;
    self.hudView.indicatorViewSize = CGSizeMake(100, 100);
    self.hudView.messageLabel.text = @"please wait....";
    [self.hudView showAtView:self.view hudType:JHUDLoadingTypeGifImage];
    
    //JHUDLoadingTypeFailure          = 5,

    self.hudView.indicatorViewSize = CGSizeMake(100, 100);
    self.hudView.messageLabel.text = @"Can't get data, please make sure the interface is correct !";
    [self.hudView.refreshButton setTitle:@"Refresh" forState:UIControlStateNormal];
    self.hudView.customImage = [UIImage imageNamed:@"5.jpg"];
    [self.hudView showAtView:self.view hudType:JHUDLoadingTypeFailure];

    //隐藏
    //[self.hudView hide];
    //[self.hudView hideAfterDelay:3];
    
    //类方法
    [JHUD showAtView:self.view message:@"我爱你" hudType:JHUDLoadingTypeCircle];
    [JHUD hideForView:self.view];
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,711评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,079评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,194评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,089评论 1 286
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,197评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,306评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,338评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,119评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,541评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,846评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,014评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,694评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,322评论 3 318
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,026评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,257评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,863评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,895评论 2 351

推荐阅读更多精彩内容

  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,072评论 4 62
  • 前言 ObjectMapper是一个基于Swfit语言实现JSON和Model间互转的第三方开源类库git传送门:...
    Mcccc阅读 903评论 0 2
  • 在公务员这个相对稳定的行业,我好像没有认真思考过我的职业规划… 我不想当领导,就这样安稳地随着工作年限的增长,级别...
    哇哇来啦阅读 212评论 2 4
  • 我心里一再想着,放下执念吧,执着也是一种执念,可是不行,执念深入骨髓,我要走一遍,我的人生没有了这执念,我还有...
    眼神犀利的猫阅读 175评论 0 0
  • 今天群打卡的主题是源自建议,让我想到一个词就是求同存异。 看了这个言辞恳切的建议,还有针对建议的其他群友的真知灼见...
    Sunny萍七阅读 551评论 0 0