伟德体育 > 赛事评论_赛事分析 > SVProgressHUD简单使用以及自定义动画
SVProgressHUD简单使用以及自定义动画

结论

总而言之, 不管你开发什么应用,你总是需要一个MBProgressHUD,而我真的推荐你使用 MBProgressHUD.官方文档对MBProgressHUD的具体功能提的过于精简,希望能借助这篇文章,能让大家一起更全面的认识 MBProgressHUD.

安装

通过CocoaPods安装,在Podfile中加入pod 'SVProgressHUD',这里不多做介绍.可以参考文章: CocoaPods的简单使用

接口易用性: MBProgressHUD == SVProgressHUD

以下是MBProgressHUD 和 SVProgressHUD 各自项目的github主页上,各自的基本用法示例:

[MBProgressHUD showHUDAddedTo:self.view animated:YES];
dispatch_async(dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_LOW, 0), ^{
    // Do something...
    dispatch_async(dispatch_get_main_queue(), ^{
        [MBProgressHUD hideHUDForView:self.view animated:YES];
    });
});

[SVProgressHUD show];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    // time-consuming task
    dispatch_async(dispatch_get_main_queue(), ^{
        [SVProgressHUD dismiss];
    });
});

在大多数场景中,你几乎只会用到显示隐藏这两个最基本的方法,所以说,尽管 SVProgressHUD 自称更加易用,但是我还是认为这真的看不出什么优势.

应用扩展

这里对这个功能不做详解.自行摸索.

接口灵活性和可扩展性: MBProgressHUD > SVProgressHUD

首先,二者都是开放源代码的,如果有特殊需求,可以完全自主定制;所以这里主要讨论的是 MBProgressHUD 和 SVProgressHUD自身在不修改核心代码的前提下的接口灵活性和可扩展性.同样的但从文档来看, SVProgressHUD 表现出更多的灵活性,参见: SVProgressHUD–比MBProgressHUD更好用的 iOS进度提示组件.但是事实并非如此! MBProgressHUD 入门文档相对很少提及其灵活性,但其提供的DEMO中较完整地展示了它的强大之处.个人认为,单单允许使用自定义视图作为提供框的视图这一点,就足以让SVProgressHUD 的绝大部分特性黯然失色;这也是我最终决定选定 MBProgressHUD 并深入使用 MBProgressHUD的重要原因.初次之外, MBProgressHUD 还支持自定义部分进度条相关的属性.具体细节如下:

@interface MBProgressHUD : UIView
/**
 * HUD完全隐藏后执行的block.
 */
@property (copy) MBProgressHUDCompletionBlock completionBlock;

/** 
 * MBProgressHUD 操作模式. 默认是 MBProgressHUDModeIndeterminate.
 *
 * @see MBProgressHUDMode
 */
@property (assign) MBProgressHUDMode mode;

/**
 * HUD显示和隐藏时使用的动画类型.
 *
 * @see MBProgressHUDAnimation
 */
@property (assign) MBProgressHUDAnimation animationType;

/**
 * HUD处于MBProgressHUDModeCustomView模式时,显示此自定义视图(比如一个 UIImageView).
 * 最好设置自定义视图宽高为 37x37(这是HUD内建指示器的边框值).
 */
@property (MB_STRONG) UIView *customView;

/** 
 * HUD代理对象.
 *
 * @see MBProgressHUDDelegate
 */
@property (MB_WEAK) id<MBProgressHUDDelegate> delegate;

/** 
 *状态指示器下可选显示的短消息.HUD会自动调整文字的尺寸. 如果文字过长,后面会用"..."代替.
  */
@property (copy) NSString *labelText;

/** 
 * 可选显示在labelText的细节文字信息.支持多行显示.
 */
@property (copy) NSString *detailsLabelText;

/** 
 * HUD的不透明度.默认是0.8.
 */
@property (assign) float opacity;

/**
 * HUD的颜色.默认黑色.设置此值后, opacity属性的值将不再使用,因为颜色也可以设置透明度.
 */
@property (MB_STRONG) UIColor *color;

/** 
 * HUD相对于父视图中心点的水平偏移量.
 */
@property (assign) float xOffset;

/** 
 * HUD相对于父视图中心点的垂直偏移量.
 */
@property (assign) float yOffset;

/**
 * HUD边缘与HUD的元素之间(比如标签,指示器,自定义视图等)的空白距离. 
 * 默认 20.0
 */
@property (assign) float margin;

/**
 * HUD圆角半径,默认10.0.
 */
@property (assign) float cornerRadius;

/** 
 * 是否给父视图添加一个放射线样式的遮罩层.默认NO.
 */
@property (assign) BOOL dimBackground;

/*
 * 用于指定某个方法执行一段时间之后再显示HUD,以秒记.如果方法在这段时间之前就执行完成,就不再显示HUD. 
 * 这主要是为了优化耗时可能极短的任务的体验.
 * 默认值为 0.
 * 这个属性仅在可以任务的状态可以知晓时,才有作用.
 * @see taskInProgress
 */
@property (assign) float graceTime;

/**
 * HUD显示的最小时间(以秒记.)
 * 这可以避免HUD刚一显示立即又隐藏所带来的不好的用户体验.
 * 默认是 0.
 */
@property (assign) float minShowTime;

/**
 * 指示被执行的操作是否还在执行. graceTime 属性依赖于这个属性.
 * 如果你没有设置graceTime(和设置为0.0不同),这个属性没有任何作用.
 * 当使用showWhileExecuting:onTarget:withObject:animated:时,这个值会被自动设置.
 * 当直接使用show:或hide:等方法显示或隐藏HUD时,你应该手动设置taskInProgress 属性的值,以保证 graceTime 能正确发挥作用.
 */
@property (assign) BOOL taskInProgress;

/**
 * HUD隐藏时,是否从父视图中移除.
 * 默认 NO. 
 */
@property (assign) BOOL removeFromSuperViewOnHide;

/** 
 * 用于主标签的字体值.
 */
@property (MB_STRONG) UIFont* labelFont;

/**
 * 主标签颜色值.
 */
@property (MB_STRONG) UIColor* labelColor;

/**
 * 详情标签字体值.
 */
@property (MB_STRONG) UIFont* detailsLabelFont;

/** 
 * 详情标签颜色.
 */
@property (MB_STRONG) UIColor* detailsLabelColor;

/**
 * 指示器颜色.默认 [UIColor whiteColor]
 */
@property (MB_STRONG) UIColor *activityIndicatorColor;

/** 
 * 进度指示器的颜色,可选 0.0 ~ 1.0,默认0.0.
 */
@property (assign) float progress;

/**
 * HUD面板的最小尺寸.默认 CGSizeZero.
 */
@property (assign) CGSize minSize;


/**
 *  HUD面板的实际尺存,只读.
 *  你可以使用它来限制HUD的可点击区域.
 * @see https://github.com/jdg/MBProgressHUD/pull/200
 */
@property (atomic, assign, readonly) CGSize size;


/**
 * 是否强制设置HUD为正方形,默认NO.
 */
@property (assign, getter = isSquare) BOOL square;

@end


@protocol MBProgressHUDDelegate <NSObject>

@optional

/** 
 * HUD完全从屏幕中隐藏时调用此方法.
 */
- (void)hudWasHidden:(MBProgressHUD *)hud;

@end


/**
 * 一个饼状图样式的进图指示视图.
 */
@interface MBRoundProgressView : UIView 

/**
 * 进度 (0.0 to 1.0)
 */
@property (nonatomic, assign) float progress;

/**
 * 进度指示器颜色.默认 [UIColor whiteColor].
 */
@property (nonatomic, MB_STRONG) UIColor *progressTintColor;

/**
 * 进度指示的背景部分的颜色.
 * 默认白色半透(透明度0.1)
 */
@property (nonatomic, MB_STRONG) UIColor *backgroundTintColor;

/*
 * 显示模式.NO,圆形;YES,环形.默认圆形.
 */
@property (nonatomic, assign, getter = isAnnular) BOOL annular;

@end


/**
 * 一个水平进度条视图. 
 */
@interface MBBarProgressView : UIView

/**
 * 进度 (0.0 to 1.0)
 */
@property (nonatomic, assign) float progress;

/**
 * 进度条边框线的颜色.
 * 默认白色 [UIColor whiteColor].
 */
@property (nonatomic, MB_STRONG) UIColor *lineColor;

/**
 * 进度条背景色.
 * 默认是 [UIColor clearColor];
 */
@property (nonatomic, MB_STRONG) UIColor *progressRemainingColor;

/**
 * 进度的颜色.
 * 默认 [UIColor whiteColor].
 */
@property (nonatomic, MB_STRONG) UIColor *progressColor;

@end

通知

SVProgressHUD发布四个通知,NSNotificationCenter以响应被显示/拒绝:

SVProgressHUDWillAppearNotification 提示框即将出现
SVProgressHUDDidAppearNotification 提示框已经出现
SVProgressHUDWillDisappearNotification 提示框即将消失
SVProgressHUDDidDisappearNotification 提示框已经消失

每个通知通过一个userInfo保存HUD状态字符串(如果有的话)的字典,可以通过检索SVProgressHUDStatusUserInfoKey

SVProgressHUD SVProgressHUDDidReceiveTouchEventNotification当用户触摸整个屏幕或SVProgressHUDDidTouchDownInsideNotification用户直接触摸HUD时也会发布。由于此通知userInfo未被传递,而对象参数包含UIEvent与触摸相关的参数。

github 流行度: MBProgressHUD - SVProgressHUD = 2500

截止目前, MBProgressHUD 的关注度为 8556, SVProgressHUD 的关注度为 6003,差额在 2500左右.github上面的流行度是很能说明两个第三方的相对优劣的,这就像各个书店上图书的购买量和评论量总是和一本书的价值成正相关一样!诚然, MBProgressHUD 和 SVProgressHUD 的关注度都是非常高的了,都已经属于非常流行的 iOS 第三方了.但是,既然我要选一个深度使用,肯定是关注度更高的那个!在大多数时候,我相信"大家"的选择,对自己是可有参考价值的!

样式

作为标准SVProgressHUD提供两种预先配置的样式:

SVProgressHUDStyleLight白色背景黑色图标和文字
SVProgressHUDStyleDark黑色背景与白色图标和文本
如果要使用自定义颜色使用setForegroundColorsetBackgroundColor:。这些方法将HUD的风格置为SVProgressHUDStyleCustom

接口丰富性: MBProgressHUD >> SVProgressHUD

MBProgressHUD 和 SVProgressHUD 都支持简单的进度提示和文字提示.单从各自github主页上来看, SVProgressHUD 似乎拥有更多的接口,但是事实并非如此.如果你下载过MBProgressHUD的示例就会发现,它能实现的功能要远远多于 文档示例给出的简单的 显示隐藏.为了能让大家更多的了解MBProgressHUD,列出部分方法与参数常量,具体信息可参考官方示例:

/**
 * 创建一个新的HUD,并把它添加并显示到提供的视图上.与之相对应的方法是 hideHUDForView:animated:.
 *
 * @note 这个方法会设置HUD的属性`removeFromSuperViewOnHide`为YES.HUD会在隐藏时自动从父视图上移除.
 *
 * @param view 将HUD添加到此视图上.
 * @param animated YES,显示时使用当前的动画类型显示;NO,直接显示不使用动画效果.
 * @return 新创建的HUD.
 *
 * @see hideHUDForView:animated:
 * @see animationType
 */
+ (MB_INSTANCETYPE)showHUDAddedTo:(UIView *)view animated:(BOOL)animated;

/**
 * 找到并隐藏子视图最顶层的HUD.与之对应的方法是 showHUDAddedTo:animated:.
 *
 * @note 这个方法会设置HUD的属性`removeFromSuperViewOnHide`为YES.HUD会在隐藏时自动从父视图上移除.
 *
 * @param view 用来在其子视图中查找HUD的视图.
 * @param animated YES,隐藏时使用当前的动画类型显示;NO,直接隐藏不使用动画效果.
 * @return YES,如果某个HUD被找到并被移除;否则返回NO.
 *
 * @see showHUDAddedTo:animated:
 * @see animationType
 */
+ (BOOL)hideHUDForView:(UIView *)view animated:(BOOL)animated;

/**
 * 找到子视图中所有的HUD,并隐藏.
 *
 * @note 这个方法会设置HUD的属性`removeFromSuperViewOnHide`为YES.HUD会在隐藏时自动从父视图上移除.
 *
 * @param view 用来在其子视图中查找HUD的视图.
 * @param animated YES,隐藏时使用当前的动画类型显示;NO,直接隐藏不使用动画效果.
 * @return 找到并移除的HUD的数量.
 *
 * @see hideHUDForView:animated:
 * @see animationType
 */
+ (NSUInteger)hideAllHUDsForView:(UIView *)view animated:(BOOL)animated;

/**
 * 找到并返回子视图最顶层的HUD.
 *
 * @param view 用来在其子视图中查找HUD的视图.
 * @return 子视图最顶层的HUD.
 */
+ (MB_INSTANCETYPE)HUDForView:(UIView *)view;

/**
 * 找到并返回子视图中所有的HUD.
 *
 * @param view 用来在其子视图中查找HUD的视图.
 * @return 所有找到的HUD视图(存储 MBProgressHUD 对象的数组).
 */
+ (NSArray *)allHUDsForView:(UIView *)view;

/**
 * 使用屏幕尺寸创建HUD的便利初始化方法. 
 *
 * @param window 提供边框值以初始化HUD的窗口.应该和HUD未来的父视图相同(比如,创建 HUD 后,将HUD添加到此窗口上).
 */
- (id)initWithWindow:(UIWindow *)window;

/**
 * 使用指定视图的边框尺寸创建HUD的便利初始化方法. 
 *
 * @param view 提供边框值以初始化HUD的视图.应该和HUD未来的父视图相同(比如,创建 HUD 后,将HUD添加到此视图上).
 */
- (id)initWithView:(UIView *)view;

/** 
 * 显示HUD.你需要确保调用此方法时,主线程未被其他任务阻塞,以便于更新视图.当你已经在新的线程中开始(比如,使用NSOperation或者NSURLRequest的异步请求等)执行某个任务后,再执行此方法. 
 *
 * @param animated YES,显示时使用当前的动画类型显示;NO,直接显示不使用动画效果. *
 * @see animationType
 */
- (void)show:(BOOL)animated;

/** 
 * 隐藏HUD.这个仍然会去尝试调用代理的hudWasHidden:方法.此方法是 show: 的配对方法.当你的任务完成时,再使用它. 
 *
 * @param animated YES,隐藏时使用当前的动画类型显示;NO,直接隐藏不使用动画效果.
 *
 * @see animationType
 */
- (void)hide:(BOOL)animated;

/** 
 *  延时隐藏HUD.这个仍然会去尝试调用代理的hudWasHidden:方法.此方法是 show: 的配对方法.当你的任务完成时,再使用它.  
 *  *
 * @param animated YES,隐藏时使用当前的动画类型显示;NO,直接隐藏不使用动画效果.
 * @param delay Delay in seconds until the HUD is hidden.
 *
 * @see animationType
 */
- (void)hide:(BOOL)animated afterDelay:(NSTimeInterval)delay;

/** 
 * 当在新线程执行某个后台任务时,显示HUD;任务完成时,自动隐藏HUD.
 *
 * 这个方法会处理自动释放池的相关技术细节,所以你可以安全使用它.
 *
 * @param method HUD显示期间,被执行的方法.这个方法会在一个新的线程中执行.
 * @param target HUD显示期间,被调用的方法归属的实例对象.
 * @param object 用来传递给方法的可选对象.
 * @param animated YES,HUD使用当前的 animationType 动画类型来显示或隐藏;否则,显示或隐藏时不使用动画效果.
 * animations while (dis)appearing.
 */
- (void)showWhileExecuting:(SEL)method onTarget:(id)target withObject:(id)object animated:(BOOL)animated;

#if NS_BLOCKS_AVAILABLE

/**
 * 当在后台队列中执行block时,显示HUD;并在block执行完毕后,隐藏HUD.
 *
 * @see showAnimated:whileExecutingBlock:onQueue:completionBlock:
 */
- (void)showAnimated:(BOOL)animated whileExecutingBlock:(dispatch_block_t)block;

/**
 * 当在后台队列中执行block时,显示HUD;并在block执行完毕后,隐藏HUD.
 *
 * @see showAnimated:whileExecutingBlock:onQueue:completionBlock:
 */
- (void)showAnimated:(BOOL)animated whileExecutingBlock:(dispatch_block_t)block completionBlock:(MBProgressHUDCompletionBlock)completion;

/**
 * 当在后台队列中执行block时,显示HUD;并在block执行完毕后,隐藏HUD.
 *
 * @see showAnimated:whileExecutingBlock:onQueue:completionBlock:
 */
- (void)showAnimated:(BOOL)animated whileExecutingBlock:(dispatch_block_t)block onQueue:(dispatch_queue_t)queue;

/** 
 * 当在一个指定的队列中执行block时,显示HUD;block执行完毕后在主线程执行completion block;然后隐藏HUD.
 *
 * @param animated YES,HUD使用当前的 animationType 动画类型来显示或隐藏;否则,显示或隐藏时不使用动画效果.
 * @param block HUD显示期间执行的block.
 * @param queue block在此队列中执行.
 * @param completion 完成时执行的block.
 *
 * @see completionBlock
 */
- (void)showAnimated:(BOOL)animated whileExecutingBlock:(dispatch_block_t)block onQueue:(dispatch_queue_t)queue
          completionBlock:(MBProgressHUDCompletionBlock)completion;

自定义动画

SVProgressHUD提供了方法可以自定义图片.但是不支持gif格式,直接利用下面的方法依然显示一张静态的图片

[SVProgressHUD showImage:[UIImage imageNamed:@"loading.gif"] status:@"加载中..."];

我们可以把gif转化为一个动态的image.
下面是我在百度上搜的一个方法.仅供参考.

#import <UIKit/UIKit.h>

typedef void (^GIFimageBlock)(UIImage *GIFImage);
@interface UIImage (GIFImage)

/** 根据本地GIF图片名 获得GIF image对象 */
+ (UIImage *)imageWithGIFNamed:(NSString *)name;

/** 根据一个GIF图片的data数据 获得GIF image对象 */
+ (UIImage *)imageWithGIFData:(NSData *)data;

/** 根据一个GIF图片的URL 获得GIF image对象 */
+ (void)imageWithGIFUrl:(NSString *)url and:(GIFimageBlock)gifImageBlock;

下面是.m的方法实现.

#import "UIImage+GIFImage.h"
#import <ImageIO/ImageIO.h>
@implementation UIImage (GIFImage)
+ (UIImage *)imageWithGIFData:(NSData *)data{

    if (!data) return nil;
    CGImageSourceRef source = CGImageSourceCreateWithData((__bridge CFDataRef)data, NULL);
    size_t count = CGImageSourceGetCount(source);
    UIImage *animatedImage;
    if (count <= 1) {
        animatedImage = [[UIImage alloc] initWithData:data];
    } else {
        NSMutableArray *images = [NSMutableArray array];
        NSTimeInterval duration = 0.0f;
        for (size_t i = 0; i < count; i++) {
            // 拿出了Gif的每一帧图片
            CGImageRef image = CGImageSourceCreateImageAtIndex(source, i, NULL); 
            //Learning... 设置动画时长 算出每一帧显示的时长(帧时长)
            NSTimeInterval frameDuration = [UIImage sd_frameDurationAtIndex:i source:source];
            duration += frameDuration;
            // 将每帧图片添加到数组中
            [images addObject:[UIImage imageWithCGImage:image scale:[UIScreen mainScreen].scale orientation:UIImageOrientationUp]];
            // 释放真图片对象
            CFRelease(image);
        }
        // 设置动画时长
        if (!duration) {
            duration = (1.0f / 10.0f) * count; 
        }
        animatedImage = [UIImage animatedImageWithImages:images duration:duration];
    }

    // 释放源Gif图片
    CFRelease(source);
    return animatedImage;
}
+ (UIImage *)imageWithGIFNamed:(NSString *)name{
    NSUInteger scale = (NSUInteger)[UIScreen mainScreen].scale;
    return [self GIFName:name scale:scale];
}

+ (UIImage *)GIFName:(NSString *)name scale:(NSUInteger)scale{
    NSString *imagePath = [[NSBundle mainBundle] pathForResource:[NSString stringWithFormat:@"%@@%zdx", name, scale] ofType:@"gif"];  
    if (!imagePath) {
        (scale + 1 > 3) ? (scale -= 1) : (scale += 1);
        imagePath = [[NSBundle mainBundle] pathForResource:[NSString stringWithFormat:@"%@@%zdx", name, scale] ofType:@"gif"];    
    }
    if (imagePath) {
        // 传入图片名(不包含@Nx)
        NSData *imageData = [NSData dataWithContentsOfFile:imagePath];
        return [UIImage imageWithGIFData:imageData];
    } else {
        imagePath = [[NSBundle mainBundle] pathForResource:name ofType:@"gif"];
        if (imagePath) { 
            // 传入的图片名已包含@Nx or 传入图片只有一张 不分@Nx
            NSData *imageData = [NSData dataWithContentsOfFile:imagePath];
            return [UIImage imageWithGIFData:imageData];
        } else {
            // 不是一张GIF图片(后缀不是gif)
            return [UIImage imageNamed:name];   
        }  
    }
}
+ (void)imageWithGIFUrl:(NSString *)url and:(GIFimageBlock)gifImageBlock{
    NSURL *GIFUrl = [NSURL URLWithString:url];
    if (!GIFUrl) return;
    dispatch_async(dispatch_get_global_queue(0, 0), ^{
        NSData *CIFData = [NSData dataWithContentsOfURL:GIFUrl];
        // 刷新UI在主线程
        dispatch_async(dispatch_get_main_queue(), ^{
            gifImageBlock([UIImage imageWithGIFData:CIFData]);
        }); 
    });
}
#pragma mark - <关于GIF图片帧时长(Learning...)>
+ (float)sd_frameDurationAtIndex:(NSUInteger)index source:(CGImageSourceRef)source {
    float frameDuration = 0.1f;
    CFDictionaryRef cfFrameProperties = CGImageSourceCopyPropertiesAtIndex(source, index, nil);
    NSDictionary *frameProperties = (__bridge NSDictionary *)cfFrameProperties;
    NSDictionary *gifProperties = frameProperties[(NSString *)kCGImagePropertyGIFDictionary];
    NSNumber *delayTimeUnclampedProp = gifProperties[(NSString *)kCGImagePropertyGIFUnclampedDelayTime];
    if (delayTimeUnclampedProp) {
        frameDuration = [delayTimeUnclampedProp floatValue];
    } 
    else {
        NSNumber *delayTimeProp = gifProperties[(NSString *)kCGImagePropertyGIFDelayTime];
        if (delayTimeProp) {
            frameDuration = [delayTimeProp floatValue];
        }
    }
    // Many annoying ads specify a 0 duration to make an image flash as quickly as possible.
    // We follow Firefox's behavior and use a duration of 100 ms for any frames that specify
    // a duration of <= 10 ms. See and
    // for more information.
    if (frameDuration < 0.011f) {
        frameDuration = 0.100f;
    }
    CFRelease(cfFrameProperties);
    return frameDuration;
}
@end

这个是UIimage的分类,在用到的控制器里面调用代码方法即可.这个分类实现我也不太懂.只会用.

   _imgView1.image = [UIImage imageWithGIFNamed:@"xuanxuan"];

    NSString *path = [[NSBundle mainBundle] pathForResource:@"xuanxuan" ofType:@"gif"];
    NSData *imgData = [NSData dataWithContentsOfFile:path];
    _imgView2.image = [UIImage imageWithGIFData:imgData];


    [UIImage imageWithGIFUrl:@"https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1495708809771&di=da92fc5cf3bdd684711ab5124ee43183&imgtype=0&src=http%3A%2F%2Fimgsrc.baidu.com%2Fforum%2Fw%253D580%2Fsign%3D91bd6cd2d42a60595210e1121835342d%2F212eb9389b504fc215d0301ee6dde71190ef6d1a.jpg" and:^(UIImage *GIFImage) {
        _imgView3.image = GIFImage;
    }];

无论如何,你总是需要一个提示框.

提示框,进度提示,加载中提示等等,无论怎样,你总是需要提示框来指示某个状态正在后台努力进行中.一个合适的提示框,更多的是用来增强用户体验.把最多的时间,用来做更核心的事;把这些不是非常重要的事,你应该试着使用一个成熟稳定的第三方来解决.

取消HUD

HUD可以使用以下方式解除:

+(void)dismiss;
+(void)dismissWithDelay :( NSTimeInterval)delay;
+ (void)dismissWithDelay:(NSTimeInterval)delay completion:(SVProgressHUDDismissCompletion)completion;

可以对这些代码进行改进,比如,在弹框结束后执行其他操作.可以封装一个方法,弹框结束后,执行Block.

这是一篇带有一定笔者主观感情色彩的比较文章.文章着重对比github上最流行的两个iOS进度提示控件 MBProgressHUD 与 SVProgressHUD的各自优劣,来帮助初学者找到一个适合的iOS提示框解决方案.

显示HUD

可以在下拉刷新或者执行其他耗时任务的时候,使用下面方法之一,来显示不确定任务的状态:

+ (void)show;
+ (void)showWithStatus:(NSString*)string;

效果图分别为:

show(不带文字)

showWithStatus(带文字)

如果你希望HUD反应任务的进度,可以使用下面方法的其中一个:

+ (void)showProgress:(CGFloat)progress;
+ (void)showProgress:(CGFloat)progress status:(NSString*)status;

通过其他方式可以实现进度条的速度把控.比如:

- (IBAction)clickButtonsShowWithProgress:(id)sender {
    progress = 0.0f;
    [SVProgressHUD showProgress:0 status:@"Loading"];
    [self performSelector:@selector(increaseProgress) withObject:nil afterDelay:0.1f];
}

- (void)increaseProgress {
    progress += 0.05f;
    [SVProgressHUD showProgress:progress status:@"xuanhe Loading"];

    if(progress < 1.0f){
        [self performSelector:@selector(increaseProgress) withObject:nil afterDelay:0.1f];
    } else {
        [self performSelector:@selector(dismiss) withObject:nil afterDelay:0.4f];
    }
}

效果如下

进度

还有其他常用的语法:

+(void)showInfoWithStatus :( NSString *)string;
+(void)showSuccessWithStatus :( NSString *)string;
+(void)showErrorWithStatus :( NSString *)string;
+(void)showImage:(UIImage *)image status :( NSString *)string;

MBProgressHUD 还是 SVProgressHUD ?

许多时候,选择都是很重要的,但是总是要做出选择.每个人考虑的因素和角度不同,结论或许也不同.但是,你要明白,你现在是要找一个合适的方案来解决自己的关于"提示框"的需求,而不是去无意义的讨论与分析.我推荐你使用 MBProgressHUD. 如果你只是想找一个答案,看到这里就够了.下面会进行一些对比分析.有时候,罗列一些可选答案,总是让人感觉很舒服的;但是我们最终都要做出选择,表明自己的态度.就像你可以依然坚持自己的看法,我会依然深度使用 MBProgressHUD一样.下面的分析不是要证明 MBProgressHUD 或 SVProgressHUD 谁好或者不好,更多的只是为了说明,我的选择可能不是最佳的,但还是靠点谱的!

使用

SVProgressHUD是已经被创建为单例的,所以不需要被实例化了,可以直接使用.调用它的方法[SVProgressHUD method].

[SVProgressHUD show ];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0),^ {
     //耗时的任务
    dispatch_async(dispatch_get_main_queue(),^ {
        [SVProgressHUD dismiss ];
    });
});

定制

SVProgressHUD 可以通过以下方法定制:

+ (void)setDefaultStyle:(SVProgressHUDStyle)style;                  // default is SVProgressHUDStyleLight
+ (void)setDefaultMaskType:(SVProgressHUDMaskType)maskType;         // default is SVProgressHUDMaskTypeNone
+ (void)setDefaultAnimationType:(SVProgressHUDAnimationType)type;   // default is SVProgressHUDAnimationTypeFlat
+ (void)setContainerView:(UIView*)containerView;                    // default is window level
+ (void)setMinimumSize:(CGSize)minimumSize;                         // default is CGSizeZero, can be used to avoid resizing
+ (void)setRingThickness:(CGFloat)width;                            // default is 2 pt
+ (void)setRingRadius:(CGFloat)radius;                              // default is 18 pt
+ (void)setRingNoTextRadius:(CGFloat)radius;                        // default is 24 pt
+ (void)setCornerRadius:(CGFloat)cornerRadius;                      // default is 14 pt
+ (void)setBorderColor:(nonnull UIColor*)color;                     // default is nil
+ (void)setBorderWidth:(CGFloat)width;                              // default is 0
+ (void)setFont:(UIFont*)font;                                      // default is [UIFont preferredFontForTextStyle:UIFontTextStyleSubheadline]
+ (void)setForegroundColor:(UIColor*)color;                         // default is [UIColor blackColor], only used for SVProgressHUDStyleCustom
+ (void)setBackgroundColor:(UIColor*)color;                         // default is [UIColor whiteColor], only used for SVProgressHUDStyleCustom
+ (void)setBackgroundLayerColor:(UIColor*)color;                    // default is [UIColor colorWithWhite:0 alpha:0.4], only used for SVProgressHUDMaskTypeCustom
+ (void)setImageViewSize:(CGSize)size;                              // default is 28x28 pt
+ (void)setInfoImage:(UIImage*)image;                               // default is the bundled info image provided by Freepik
+ (void)setSuccessImage:(UIImage*)image;                            // default is bundled success image from Freepik
+ (void)setErrorImage:(UIImage*)image;                              // default is bundled error image from Freepik
+ (void)setViewForExtension:(UIView*)view;                          // default is nil, only used if #define SV_APP_EXTENSIONS is set
+ (void)setGraceTimeInterval:(NSTimeInterval)interval;              // default is 0 seconds
+ (void)setMinimumDismissTimeInterval:(NSTimeInterval)interval;     // default is 5.0 seconds
+ (void)setMaximumDismissTimeInterval:(NSTimeInterval)interval;     // default is CGFLOAT_MAX
+ (void)setFadeInAnimationDuration:(NSTimeInterval)duration;        // default is 0.15 seconds
+ (void)setFadeOutAnimationDuration:(NSTimeInterval)duration;       // default is 0.15 seconds
+ (void)setMaxSupportedWindowLevel:(UIWindowLevel)windowLevel;      // default is UIWindowLevelNormal
+ (void)setHapticsEnabled:(BOOL)hapticsEnabled;                     // default is NO

触觉反馈

对于具有较新设备的用户(从iPhone 7开始),SVProgressHUD可以根据显示的HUD来自动触发触觉反馈。反馈图如下:

  • showSuccessWithStatus: < - > UINotificationFeedbackTypeSuccess

  • showInfoWithStatus: < - > UINotificationFeedbackTypeWarning

  • showErrorWithStatus: < - > UINotificationFeedbackTypeError

要启用此功能,请使用setHapticsEnabled:

具有iPhone 7之前的设备的用户将不会改变功能。

SVProgressHUD 是一个干净,易于使用的HUD,旨在显示iOS和tvOS正在进行的任务的进展。
常用的还有MBProgressHUD.这两个都是很常用的HUD,大体相似,但是还是有一些不同的.
MBProgressHUD和SVProgressHUD的区别:
svprogresshud 使用起来很方便,但 可定制 差一些,看它的接口貌似只能添加一个全屏的HUD,不能把它添加到某个视图上面去.
MBProgressHUD 功能全一些,可定制 高一些,而且可以指定加到某一个View上去.用起来可能就没上面那个方便了.
具体还要看你的使用场景.
附上GitHub源码地址:
SVProgressHUD:https://github.com/SVProgressHUD/SVProgressHUD
MBProgressHUD:https://github.com/jdg/MBProgressHUD
今天我们不对二者的区别做详解,有空我会专门写文章对它们的区别做一个详解.
今天我们主要简单介绍一下SVProgressHUD的使用.

上一篇:Bit和Byte的区别及单位换算 下一篇:没有了
返回列表