zoukankan      html  css  js  c++  java
  • MBProgressHUD的基本使用

          其实MBProgressHUD挺简单的,只有MBProgressHUD.h和.m文件,用的时候拖入工程或使用cocoapods安装(pod   'MBProgressHUD')。想做复杂的效果可以参考作者gitHub上的DEMO(地址:MBProgressHUD),写得也很清楚明了。

    //

    //  MBProgressHUD.h

    //  Version 1.0.0

    /*

     进度指示器

     */

    #import <Foundation/Foundation.h>

    #import <UIKit/UIKit.h>

    #import <CoreGraphics/CoreGraphics.h>

    @class MBBackgroundView;

    @protocol MBProgressHUDDelegate;

    extern CGFloat const MBProgressMaxOffset;//设置 MBProgressHUD的位置

    /*

     MBProgressHUDMode 类型枚举

     */

    typedef NS_ENUM(NSInteger, MBProgressHUDMode) {

         // 使用UIActivityIndicatorView来显示进度,这是默认值

        MBProgressHUDModeIndeterminate,

        // 使用一个圆形饼图来作为进度视图

        MBProgressHUDModeDeterminate,

         // 使用一个水平进度条

        MBProgressHUDModeDeterminateHorizontalBar,

         // 使用圆环作为进度条

        MBProgressHUDModeAnnularDeterminate,

        // 显示一个自定义视图,通过这种方式,可以显示一个正确或错误的提示图

        MBProgressHUDModeCustomView,

        // 只显示文本

        MBProgressHUDModeText

    };

    /*

     MBProgressHUDAnimation 动画枚举

     */

    typedef NS_ENUM(NSInteger, MBProgressHUDAnimation) {

        /// Opacity animation

        MBProgressHUDAnimationFade,

        /// Opacity + scale animation (zoom in when appearing zoom out when disappearing)

        MBProgressHUDAnimationZoom,

        /// Opacity + scale animation (zoom out style)

        MBProgressHUDAnimationZoomOut,

        /// Opacity + scale animation (zoom in style)

        MBProgressHUDAnimationZoomIn

    };

    /*

     背景样式

     */

    typedef NS_ENUM(NSInteger, MBProgressHUDBackgroundStyle) {

        /// Solid color background

        MBProgressHUDBackgroundStyleSolidColor,

        /// UIVisualEffectView or UIToolbar.layer background view

        MBProgressHUDBackgroundStyleBlur

    };

    /*

     完成block

     */

    typedef void (^MBProgressHUDCompletionBlock)();

    #pragma mark ===== 正文 =======

    NS_ASSUME_NONNULL_BEGIN

    /** 

     * Displays a simple HUD window containing(包含) a progress indicator(进度指示器) and two optional labels(下面的label,detailsLabel) for short messages.

     *

     * This is a simple drop-in(插入的) class for displaying a progress HUD view similar to(和...相似) Apple's private (私有的)UIProgressHUD class.

     * The MBProgressHUD window spans over the entire space(横跨整个屏幕) given to it by the initWithFrame: constructor and catches all

     * user input on this region, thereby preventing the user operations on components below the view.

     *

     * @note To still allow touches to pass through(穿过…;通过…) the HUD, you can set hud.userInteractionEnabled = NO. 为了不和你的UI冲突,所以这样设置

     * @attention MBProgressHUD is a UI class and should therefore only be accessed on the main thread.因为MBProgressHUD继承自UIView,所以必须在主线程上使用

     */

    //MBProgressHUD继承自UIView

    @interface MBProgressHUD : UIView

    #pragma ====  Creates a new HUD  And hideHUD ====

    /**

     * Creates a new HUD(下面是创建a new HUD的方法), adds it to provided view and shows it. The counterpart(对应的人或物; 副本; 对应的人;) to this method is hideHUDForView:animated:.(也就是隐藏的方法)

     * 方法的介绍

     * @note This method sets removeFromSuperViewOnHide. The HUD will automatically(自动地) be removed from the view hierarchy when hidden.

     *

     * 参数的介绍

     *  @param view The view that the HUD will be added to 在哪展示

     * @param animated If set to YES the HUD will appear using the current animationType. If set to NO the HUD will not use

     * animations while appearing. 动画

     * @return A reference to(提及,参考;关于;提到) the created HUD.

     *

     * @see hideHUDForView:animated:

     * @see animationType

     */

    + (instancetype)showHUDAddedTo:(UIView *)view animated:(BOOL)animated;

    /// @name Showing and hiding

    /**

     * Finds the top-most HUD subview and hides it. The counterpart to this method is showHUDAddedTo:animated:.

     *

     * @note This method sets removeFromSuperViewOnHide. The HUD will automatically be removed from the view hierarchy when hidden.

     *

     * @param view The view that is going to be searched for a HUD subview.

     * @param animated If set to YES the HUD will disappear using the current animationType. If set to NO the HUD will not use

     * animations while disappearing.

     * @return YES if a HUD was found and removed, NO otherwise.

     *

     * @see showHUDAddedTo:animated:

     * @see animationType

     */

    + (BOOL)hideHUDForView:(UIView *)view animated:(BOOL)animated;

    /**

     * Finds the top-most HUD subview and returns it. 

     *

     * @param view The view that is going to be searched.

     * @return A reference to the last HUD subview discovered.

     */

    + (nullable MBProgressHUD *)HUDForView:(UIView *)view;

    /**

     * A convenience constructor(构造函数) that initializes(初始化) the HUD with the view's bounds. Calls the designated constructor with

     * view.bounds as the parameter.

     *

     * @param view The view instance(举...为例) that will provide the bounds for the HUD. Should be the same instance as

     * the HUD's superview (i.e., the view that the HUD will be added to).

     */

    - (instancetype)initWithView:(UIView *)view;

    #pragma ===== Displays the HUD.=====

    /** 

     * Displays the HUD. 

     *

     * @note You need to make sure that the main thread completes its run loop soon after this method call so that

     * the user interface can be updated. Call this method when your task is already set up to be executed in a new thread

     * (e.g., when using something like NSOperation or making an asynchronous call like NSURLRequest).

     *

     * @param animated If set to YES the HUD will appear using the current animationType. If set to NO the HUD will not use

     * animations while appearing.

     *

     * @see animationType

     */

    - (void)showAnimated:(BOOL)animated;

    /** 

     * Hides the HUD. This still calls the hudWasHidden: delegate. This is the counterpart of the show: method. Use it to

     * hide the HUD when your task completes.

     *

     * @param animated If set to YES the HUD will disappear using the current animationType. If set to NO the HUD will not use

     * animations while disappearing.

     *

     * @see animationType

     */

    - (void)hideAnimated:(BOOL)animated;

    /** 

     * Hides the HUD after a delay. This still calls the hudWasHidden: delegate. This is the counterpart of the show: method. Use it to

     * hide the HUD when your task completes.

     *

     * @param animated If set to YES the HUD will disappear using the current animationType. If set to NO the HUD will not use

     * animations while disappearing.

     * @param delay Delay in seconds until the HUD is hidden.

     *

     * @see animationType

     */

    - (void)hideAnimated:(BOOL)animated afterDelay:(NSTimeInterval)delay; //带延迟的隐藏

    /**

     * The HUD delegate object. Receives HUD state notifications.接收HUD的状态通知

     */

    @property (weak, nonatomic) id<MBProgressHUDDelegate> delegate;

    /**

     * Called after the HUD is hiden. 隐藏后调用

     */

    @property (copy, nullable) MBProgressHUDCompletionBlock completionBlock;

    /*

     * Grace period is the time (in seconds) that the invoked method may be run without

     * showing the HUD. If the task finishes before the grace time runs out, the HUD will

     * not be shown at all.

     * This may be used to prevent HUD display for very short tasks.

     * Defaults to 0 (no grace time).

     */

    // 这个属性设置了一个宽限期,它是在没有显示HUD窗口前被调用方法可能运行的时间。

    // 如果被调用方法在宽限期内执行完,则HUD不会被显示。

    // 这主要是为了避免在执行很短的任务时,去显示一个HUD窗口。

    // 默认值是0。只有当任务状态是已知时,才支持宽限期。具体我们看实现代码。

    @property (assign, nonatomic) NSTimeInterval graceTime;

    /**

     * The minimum time (in seconds) that the HUD is shown.

     * This avoids the problem of the HUD being shown and than instantly hidden.

     * Defaults to 0 (no minimum show time).

     */

    // HUD显示的最短时间。设置这个值是为了避免HUD显示后立即被隐藏。默认值为0

    @property (assign, nonatomic) NSTimeInterval minShowTime;

    /**

     * Removes the HUD from its parent view when hidden.任务完成后从父视图移除

     * Defaults to NO.

     */

    // 隐藏时是否将HUD从父视图中移除,默认是NO。

    @property (assign, nonatomic) BOOL removeFromSuperViewOnHide;

    /// @name Appearance

    /** 

     * MBProgressHUD operation mode. The default is MBProgressHUDModeIndeterminate.

     */

    //默认情况下,使用的是菊花(MBProgressHUDModeIndeterminate)。

    //对于其它几种模式,MBProgressHUD专门我们提供了几个视图类。如果是进度条模式(MBProgressHUDModeDeterminateHorizontalBar),则使用的是MBBarProgressView类;如果是饼图模式(MBProgressHUDModeDeterminate)或环形模式(MBProgressHUDModeAnnularDeterminate),则使用的是MBRoundProgressView类。上面这两个类的主要操作就是在drawRect:中根据一些进度参数来绘制形状,大家可以自己详细看一下。

    @property (assign, nonatomic) MBProgressHUDMode mode;

    /**

     * A color that gets forwarded to all labels and supported indicators. Also sets the tintColor

     * for custom views on iOS 7+. Set to nil to manage color individually.

     * Defaults to semi-translucent black on iOS 7 and later and white on earlier iOS versions.

     */

    @property (strong, nonatomic, nullable) UIColor *contentColor UI_APPEARANCE_SELECTOR;

    /**

     * The animation type that should be used when the HUD is shown and hidden.

     */

    // HUD显示和隐藏的动画类型

    @property (assign, nonatomic) MBProgressHUDAnimation animationType UI_APPEARANCE_SELECTOR;

    /**

     * The bezel offset relative to the center of the view. You can use MBProgressMaxOffset

     * and -MBProgressMaxOffset to move the HUD all the way to the screen edge in each direction.

     * E.g., CGPointMake(0.f, MBProgressMaxOffset) would position the HUD centered on the bottom edge. 设置HUD弹窗的位置 这个例子会使弹窗从底部弹出

     */

    @property (assign, nonatomic) CGPoint offset UI_APPEARANCE_SELECTOR;

    /**

     * The amount of space between the HUD edge and the HUD elements (labels, indicators or custom views).

     * This also represents the minimum bezel distance to the edge of the HUD view.

     * Defaults to 20.f

     */

    // HUD各元素与HUD边缘的间距

    @property (assign, nonatomic) CGFloat margin UI_APPEARANCE_SELECTOR;

    /**

     * The minimum size of the HUD bezel. Defaults to CGSizeZero (no minimum size).

     */

    // HUD背景框的最小大小

    @property (assign, nonatomic) CGSize minSize UI_APPEARANCE_SELECTOR;

    /**

     * Force the HUD dimensions to be equal if possible.

     */

    // 是否强制HUD背景框宽高相等

    @property (assign, nonatomic, getter = isSquare) BOOL square UI_APPEARANCE_SELECTOR;

    /**

     * When enabled, the bezel center gets slightly affected by the device accelerometer data.

     * Has no effect on iOS < 7.0. Defaults to YES.

     */

    @property (assign, nonatomic, getter=areDefaultMotionEffectsEnabled) BOOL defaultMotionEffectsEnabled UI_APPEARANCE_SELECTOR;

    /// @name Progress

    /**

     * The progress of the progress indicator, from 0.0 to 1.0. Defaults to 0.0.

     */

    @property (assign, nonatomic) float progress;

    /// @name ProgressObject

    /**

     * The NSProgress object feeding the progress information to the progress indicator.

     */

    @property (strong, nonatomic, nullable) NSProgress *progressObject;

    /// @name Views

    /**

     * The view containing the labels and indicator (or customView).

     */

    @property (strong, nonatomic, readonly) MBBackgroundView *bezelView;

    /**

     * View covering the entire HUD area, placed behind bezelView.

     */

    @property (strong, nonatomic, readonly) MBBackgroundView *backgroundView;

    /**

     * The UIView (e.g., a UIImageView) to be shown when the HUD is in MBProgressHUDModeCustomView.

     * The view should implement intrinsicContentSize for proper sizing. For best results use approximately 37 by 37 pixels.

     */

    @property (strong, nonatomic, nullable) UIView *customView;

    /**

     * A label that holds an optional short message to be displayed below the activity indicator. The HUD is automatically resized to fit

     * the entire text.

     */

    @property (strong, nonatomic, readonly) UILabel *label;

    /**

     * A label that holds an optional details message displayed below the labelText message. The details text can span multiple lines.

     */

    @property (strong, nonatomic, readonly) UILabel *detailsLabel;

    /**

     * A button that is placed below the labels. Visible only if a target / action is added. 

     */

    @property (strong, nonatomic, readonly) UIButton *button;

    @end

    //MBProgressHUD为我们提供了一个HUD窗口的很好的实现,不过个人在使用过程中,觉得它给我们提供的交互功能太少。其代理只提供了一个-hudWasHidden:方法,而且我们也无法通过点击HUD来执行一些操作。在现实的需求中,可能存在这种情况:比如一个网络操作,在发送请求等待响应的过程中,我们会显示一个HUD窗口以显示一个loading框。但如果我们想在等待响应的过程中,在当前视图中取消这个网络请求,就没有相应的处理方式,MBProgressHUD没有为我们提供这样的交互操作。当然这时候,我们可以根据自己的需求来修改源码。

    @protocol MBProgressHUDDelegate <NSObject>

    @optional

    /** 

     * Called after the HUD was fully hidden from the screen. 

     */

    - (void)hudWasHidden:(MBProgressHUD *)hud;

    @end

    #pragma ====== MBRoundProgressView =====

    /**

     * A progress view for showing definite progress by filling up a circle (pie chart).

     */

    @interface MBRoundProgressView : UIView 

    /**

     * Progress (0.0 to 1.0)

     */

    @property (nonatomic, assign) float progress;

    /**

     * Indicator progress color.

     * Defaults to white [UIColor whiteColor].

     */

    @property (nonatomic, strong) UIColor *progressTintColor;

    /**

     * Indicator background (non-progress) color. 

     * Only applicable on iOS versions older than iOS 7.

     * Defaults to translucent white (alpha 0.1).

     */

    @property (nonatomic, strong) UIColor *backgroundTintColor;

    /*

     * Display mode - NO = round or YES = annular. Defaults to round.

     */

    @property (nonatomic, assign, getter = isAnnular) BOOL annular;

    @end

    #pragma =======   A flat bar progress view. =====

    /**

     * A flat bar progress view. 

     */

    @interface MBBarProgressView : UIView

    /**

     * Progress (0.0 to 1.0)

     */

    @property (nonatomic, assign) float progress;

    /**

     * Bar border line color.

     * Defaults to white [UIColor whiteColor].

     */

    @property (nonatomic, strong) UIColor *lineColor;

    /**

     * Bar background color.

     * Defaults to clear [UIColor clearColor];

     */

    @property (nonatomic, strong) UIColor *progressRemainingColor;

    /**

     * Bar progress color.

     * Defaults to white [UIColor whiteColor].

     */

    @property (nonatomic, strong) UIColor *progressColor;

    @end

    #pragma =======  MBBackgroundView =====

    @interface MBBackgroundView : UIView

    /**

     * The background style. 

     * Defaults to MBProgressHUDBackgroundStyleBlur on iOS 7 or later and MBProgressHUDBackgroundStyleSolidColor otherwise.

     * @note Due to iOS 7 not supporting UIVisualEffectView, the blur effect differs slightly between iOS 7 and later versions.

     */

    @property (nonatomic) MBProgressHUDBackgroundStyle style;

    /**

     * The background color or the blur tint color.

     * @note Due to iOS 7 not supporting UIVisualEffectView, the blur effect differs slightly between iOS 7 and later versions.

     */

    // 背景框的颜色

    // 需要注意的是如果设置了这个属性,则opacity属性会失效,即不会有半透明效果

    @property (nonatomic, strong) UIColor *color;

    @end

    #pragma ======  MBProgressHUD (Deprecated) =====

    @interface MBProgressHUD (Deprecated)

    + (NSArray *)allHUDsForView:(UIView *)view __attribute__((deprecated("Store references when using more than one HUD per view.")));

    + (NSUInteger)hideAllHUDsForView:(UIView *)view animated:(BOOL)animated __attribute__((deprecated("Store references when using more than one HUD per view.")));

    - (id)initWithWindow:(UIWindow *)window __attribute__((deprecated("Use initWithView: instead.")));

    - (void)show:(BOOL)animated __attribute__((deprecated("Use showAnimated: instead.")));

    - (void)hide:(BOOL)animated __attribute__((deprecated("Use hideAnimated: instead.")));

    - (void)hide:(BOOL)animated afterDelay:(NSTimeInterval)delay __attribute__((deprecated("Use hideAnimated:afterDelay: instead.")));

    - (void)showWhileExecuting:(SEL)method onTarget:(id)target withObject:(id)object animated:(BOOL)animated __attribute__((deprecated("Use GCD directly.")));

    - (void)showAnimated:(BOOL)animated whileExecutingBlock:(dispatch_block_t)block __attribute__((deprecated("Use GCD directly.")));

    - (void)showAnimated:(BOOL)animated whileExecutingBlock:(dispatch_block_t)block completionBlock:(nullable MBProgressHUDCompletionBlock)completion __attribute__((deprecated("Use GCD directly.")));

    - (void)showAnimated:(BOOL)animated whileExecutingBlock:(dispatch_block_t)block onQueue:(dispatch_queue_t)queue __attribute__((deprecated("Use GCD directly.")));

    - (void)showAnimated:(BOOL)animated whileExecutingBlock:(dispatch_block_t)block onQueue:(dispatch_queue_t)queue

         completionBlock:(nullable MBProgressHUDCompletionBlock)completion __attribute__((deprecated("Use GCD directly.")));

    @property (assign) BOOL taskInProgress __attribute__((deprecated("No longer needed.")));

    @property (nonatomic, copy) NSString *labelText __attribute__((deprecated("Use label.text instead.")));

    @property (nonatomic, strong) UIFont *labelFont __attribute__((deprecated("Use label.font instead.")));

    @property (nonatomic, strong) UIColor *labelColor __attribute__((deprecated("Use label.textColor instead.")));

    @property (nonatomic, copy) NSString *detailsLabelText __attribute__((deprecated("Use detailsLabel.text instead.")));

    @property (nonatomic, strong) UIFont *detailsLabelFont __attribute__((deprecated("Use detailsLabel.font instead.")));

    @property (nonatomic, strong) UIColor *detailsLabelColor __attribute__((deprecated("Use detailsLabel.textColor instead.")));

    @property (assign, nonatomic) CGFloat opacity __attribute__((deprecated("Customize bezelView properties instead.")));

    @property (strong, nonatomic) UIColor *color __attribute__((deprecated("Customize the bezelView color instead.")));

    @property (assign, nonatomic) CGFloat xOffset __attribute__((deprecated("Set offset.x instead.")));

    @property (assign, nonatomic) CGFloat yOffset __attribute__((deprecated("Set offset.y instead.")));

    @property (assign, nonatomic) CGFloat cornerRadius __attribute__((deprecated("Set bezelView.layer.cornerRadius instead.")));

    @property (assign, nonatomic) BOOL dimBackground __attribute__((deprecated("Customize HUD background properties instead.")));

    @property (strong, nonatomic) UIColor *activityIndicatorColor __attribute__((deprecated("Use UIAppearance to customize UIActivityIndicatorView. E.g.: [UIActivityIndicatorView appearanceWhenContainedIn:[MBProgressHUD class], nil].color = [UIColor redColor];")));

    @property (atomic, assign, readonly) CGSize size __attribute__((deprecated("Get the bezelView.frame.size instead.")));

    @end

    NS_ASSUME_NONNULL_END

     

    其他人已经总结的很好了,就不重复造车了。所以MBProgressHUD的基本使用,可参考以下地址(有的方法已经Deprecated,所以仅为参考):

    iOS 源代码分析 --- MBProgressHUD:  http://www.cocoachina.com/ios/20160601/16552.html

     MBProgressHUD的基本使用: https://my.oschina.net/jilin/blog/393005

    MBProgressHUD 使用详解:http://m.blog.csdn.net/article/details?id=51208310

  • 相关阅读:
    【bzoj2500】幸福的道路 树形dp+单调队列
    【ARC069F】Flags 2-sat+线段树优化建图+二分
    【bzoj2437】[Noi2011]兔兔与蛋蛋 二分图最大匹配+博弈论
    剑指offer——树的子结构
    剑指offer——反转链表
    腾讯算法岗面试算法题——计数排序
    作业帮面试题
    剑指offer——重建二叉树
    剑指offer——二维数组中的查找
    删除链表中重复的结点
  • 原文地址:https://www.cnblogs.com/dreamDeveloper/p/6052837.html
Copyright © 2011-2022 走看看