Swift.封装MBProgressHUD,简化调用方式

1544002716957602.gif

前言:

MBProgressHUD,是iOS开发中很经典的一个框架,我们可能每个项目,乃至每个ViewController都能用到,越是常用的控件,就更应该简化其调用方式,来优化我们自己的代码.这里我列举出自己常用封装,也建议各位将自己常用的模式也封装起来.

12月6日更新添加了覆盖navigationBar的形式,以及添加了对navigationController?.navigationBar.isTranslucent属性的判断,实现不同项目的正常显示.

实现效果:

对调用方法进行封装,实现一行代码弹出HUD

实现七种形式:

  • 不遮盖navigationBar背景半透明显示文字
  • 遮盖navigationBar背景半透明显示文字
  • 背景透明显示文字
  • 背景透明显示Loading
  • 不遮盖navigationBar背景半透明显示Loading
  • 遮盖navigationBar背景半透明显示Loading
  • 背景透明显示自定义icon+文字

实现方式:

1.新建一个类,并实现创建HUD实例方法.

2.实现显示HUD方法.

3.展示loadingView方法.

4.类Toast只展示文字方法.

5.展示成功,失败类似icon+文字方法.

6.隐藏HUD方法


1.新建一个类,并实现创建HUD实例方法.

      /// 创建Hud
    ///
    /// - Parameters:
    ///   - view: 加载到哪个View展示.
    ///   - isMask: 是否是蒙层形式,背景半透明.
    ///   - isTranslucent: 项目中navigationBar是否计算frame,默认是false,如果项目中有调用self.navigationController?.navigationBar.isTranslucent = true则传入true
    private class func createHud(view : UIView? = UIApplication.shared.keyWindow, isMask : Bool = false ,isTranslucent: Bool = false) -> MBProgressHUD? {
        guard let supview = view ?? UIApplication.shared.keyWindow else {return nil}
        let HUD = MBProgressHUD.showAdded(to: supview
            , animated: true)
        let top = isTranslucent ? 0 : EWScreenInfo.navigationHeight
        HUD.frame = CGRect(x: 0, y: top, width: EWScreenInfo.Width, height: EWScreenInfo.Height - top)
        HUD.animationType = .zoom
        if isMask {
            /// 蒙层type,背景半透明.
            HUD.backgroundView.color = UIColor(white: 0.0, alpha: 0.4)
        } else {
            /// 非蒙层type,没有背景.
            HUD.backgroundView.color = UIColor.clear
            HUD.bezelView.backgroundColor = UIColor(white: 0.0, alpha: 0.9)
            HUD.contentColor = UIColor.white
        }
        HUD.removeFromSuperViewOnHide = true
        HUD.show(animated: true)
        return HUD
    }
    /// 创建hud,覆盖navigationbar
    ///
    /// - Parameters:
    ///   - navigationController: 如果想要覆盖navigationBar则需要传入navigationController
    ///   - isMask:  是否蒙层覆盖
    /// - Returns: hud实例
    private class func createHud(navigationController : UINavigationController?, isMask : Bool = false) -> MBProgressHUD? {
        guard let navc = navigationController else {return nil}
        guard let supview = navc.view else {return nil}
        let HUD = MBProgressHUD.showAdded(to: supview
            , animated: true)
        HUD.frame = CGRect(x: 0, y: 0, width: EWScreenInfo.Width, height: EWScreenInfo.Height)
        HUD.animationType = .zoom
        if isMask {
            /// 蒙层type,背景半透明.
            HUD.backgroundView.color = UIColor(white: 0.0, alpha: 0.4)
        } else {
            /// 非蒙层type,没有背景.
            HUD.backgroundView.color = UIColor.clear
            HUD.bezelView.backgroundColor = UIColor(white: 0.0, alpha: 0.9)
            HUD.contentColor = UIColor.white
        }
        HUD.removeFromSuperViewOnHide = true
        HUD.show(animated: true)
        return HUD
    }

2.实现显示HUD方法.

  /// 直接展示Hud
    ///
    /// - Parameters:
    ///   - message: 显示信息
    ///   - icon: 显示图片
    ///   - view: 加载到哪个View上展示
    ///   - coverNavigationController: 要覆盖NavigationBar,需要传入NavigationController
    ///   - isTranslucent: 自己项目中navigationBar是否参与frame设置,默认为False,如果项目中主动将其设置为true,可以传入True.不传的话中弹出view会有半个navigationBar.height的向下偏移.
    ///   - completeBlock: UD消失后调用block
    private class func showHudTips (message : String?, icon : String?, view : UIView?, coverNavigationController: UINavigationController? = nil, isTranslucent: Bool = false,completeBlock : (()->(Void))?) {
        var HUD: MBProgressHUD?
        if coverNavigationController != nil {
            HUD = self.createHud(navigationController: coverNavigationController!)
        }else {
            HUD = self.createHud(view: view, isMask: false, isTranslucent: isTranslucent)
        }
        HUD?.label.text = message
        HUD?.label.numberOfLines = 0
        /// 如果有Icon展示.
        if let icon = icon {
            HUD?.customView = UIImageView.init(image: UIImage.init(named: "\(icon)"))
        }
        HUD?.mode = .customView
        /// 在hud消失时调用completeBlock.
        DispatchQueue.main.asyncAfter(deadline: .now() + hudShowTime) {
            HUD?.hide(animated: true)
            guard let completeBlock = completeBlock else {
                return
            }
            completeBlock()
        }
    }

3.展示loadingView方法.

两个方法,返回实例方法可以根据自己需求修改返回的实例.
调用展示loadingView时,必须在结束loading时手动调用隐藏HUD方法!!!

    /// 展示loadingHUD,可用于网络请求
    ///
    /// - Parameters:
    ///   - view: 父级View,默认是当前展示View
    ///   - message: 展示文字
    ///   - isMask: 是否是蒙层形式,true是半透明背景的蒙层模式,false是只有Hub不带背景
    ///   - isTranslucent: 自己项目中navigationBar是否参与frame设置,默认为False,如果项目中主动将其设置为true,可以传入True.不传的话中弹出view会有半个navigationBar.height的向下偏移.
    class func showLoadingHudView (view : UIView? = UIApplication.shared.keyWindow ,message:String?, isMask : Bool = false,isTranslucent: Bool = false){
        let HUD = self.createHud(view: view,isMask: isMask, isTranslucent: isTranslucent)
        HUD?.mode = .indeterminate
        HUD?.label.text = message
        hud = HUD
    }
    /// 展示loadingHUD,可用于网络请求
    ///
    /// - Parameters:
    ///   - NAVC: 要覆盖NavigationBar,需要传入NavigationController
    ///   - message: 展示文字
    ///   - isMask: 是否是蒙层形式,true是半透明背景的蒙层模式,false是只有Hub不带背景
    class func showLoadingHudView (NAVC : UINavigationController? ,message:String?){
        let HUD = self.createHud(navigationController: NAVC, isMask: true)
        HUD?.mode = .indeterminate
        HUD?.label.text = message
        hud = HUD
    }
    /// 生成实例的loadingHUD,可以再对实例进行自定义修改
    ///
    /// - Parameters:
    ///   - view: 父级View,默认是当前展示View
    ///   - message: 展示文字
    ///   - isMask: 是否是蒙层形式,true是半透明背景的蒙层模式,false是只有Hub不带背景
    ///   - isTranslucent: 自己项目中navigationBar是否参与frame设置,默认为False,如果项目中主动将其设置为true,可以传入True.不传的话中弹出view会有半个navigationBar.height的向下偏移.
    /// - Returns: hud示例,可以自己为实例进行修改
    class func showLoadingHudInView (view : UIView? = UIApplication.shared.keyWindow ,message:String?, isMask : Bool = false,isTranslucent: Bool = false) -> MBProgressHUD?{
        let HUD = self.createHud(view: view, isMask: isMask, isTranslucent: isTranslucent)
        HUD?.mode = .indeterminate
        HUD?.label.text = message
        hud = HUD
        return hud
    }

4.类Toast只展示文字方法.

     /// 展示类ToastHUD
    ///
    /// - Parameters:
    ///   - message: 展示文字
    ///   - view: 父级View,默认是当前展示View
    ///   - isMask: 是否是蒙层形式,true是半透明背景的蒙层模式,false是只有Hub不带背景
    ///   - afterDelay: view消失时间
    ///   - isTranslucent: 自己项目中navigationBar是否参与frame设置,默认为False,如果项目中主动将其设置为true,可以传入True.不传的话中弹出view会有半个navigationBar.height的向下偏移.
    class func showTextHudTips(message : String?, view : UIView? = UIApplication.shared.keyWindow , isMask : Bool = false,afterDelay:Double = hudShowTime,isTranslucent: Bool = false) {
        let HUD = self.createHud(view: view, isMask: isMask, isTranslucent: isTranslucent)
        HUD?.mode = .text
        HUD?.detailsLabel.font = UIFont.systemFont(ofSize: 16.0)
        HUD?.detailsLabel.text = message
        HUD?.hide(animated: true, afterDelay: afterDelay)
    }
    /// 覆盖NavigationBar的l类ToastHUD
    ///
    /// - Parameters:
    ///   - NAVC: 要覆盖NavigationBar,需要传入NavigationController
    ///   - message: 展示文字
    ///   - isMask: 是否是蒙层形式,true是半透明背景的蒙层模式,false是只有Hub不带背景
    ///   - afterDelay: view消失时间
    class func showTextHudTips(NAVC : UINavigationController? ,message:String?, isMask : Bool = false,afterDelay: Double = hudShowTime){
        let HUD = self.createHud(navigationController: NAVC,isMask :isMask)
        HUD?.mode = .text
        HUD?.detailsLabel.font = UIFont.systemFont(ofSize: 16.0)
        HUD?.detailsLabel.text = message
        HUD?.hide(animated: true, afterDelay: afterDelay)
    }
    /// 生成实例的类ToastHUD,可以再对实例进行自定义修改
    ///
    /// - Parameters:
    ///   - message: 展示文字
    ///   - view: 父级View,默认是当前展示View
    ///   - isMask: 是否是蒙层形式,true是半透明背景的蒙层模式,false是只有Hub不带背景
    ///   - afterDelay: view消失时间
    ///   - isTranslucent: 自己项目中navigationBar是否参与frame设置,默认为False,如果项目中主动将其设置为true,可以传入True.不传的话中弹出view会有半个navigationBar.height的向下偏移.
    /// - Returns: hud示例,可以自己为实例进行修改
    class func showTextHud (message : String?, view : UIView? = UIApplication.shared.keyWindow , isMask : Bool = false,afterDelay:Double = hudShowTime,isTranslucent: Bool = false) -> MBProgressHUD? {
        let HUD = self.createHud(view: view, isMask: isMask, isTranslucent: isTranslucent)
        HUD?.mode = .text
        HUD?.detailsLabel.font = UIFont.systemFont(ofSize: 16.0)
        HUD?.detailsLabel.text = message
        HUD?.hide(animated: true, afterDelay: afterDelay)
        return HUD
    }

5.展示成功,失败类似icon+文字方法.

本质上是icon+文字形式,传入自己项目图片,建议大小为64X64

// 展示成功HUD,可自己修改图片,icon图片需要自己添加到项目中,建议大小为64X64
    ///
    /// - Parameters:
    ///   - message: 展示文字
    ///   - view: 父级View,默认是当前展示View
    ///   - afterDelay: view消失时间
    ///   - isTranslucent: 自己项目中navigationBar是否参与frame设置,默认为False,如果项目中主动将其设置为true,可以传入True.不传的话中弹出view会有半个navigationBar.height的向下偏移.
    class func showSuccesshTips (message : String?, view : UIView? = UIApplication.shared.keyWindow ,afterDelay:Double = hudShowTime,isTranslucent: Bool = false) {
        self.showHudTips(message: message, icon: "Success.png", view: view, isTranslucent: isTranslucent, completeBlock: nil)
    }
    // 展示成功HUD,可传入HUD隐藏后调用Block
    ///
    /// - Parameters:
    ///   - message: 展示文字
    ///   - view: 父级View,默认是当前展示View
    ///   - isTranslucent: 自己项目中navigationBar是否参与frame设置,默认为False,如果项目中主动将其设置为true,可以传入True.不传的话中弹出view会有半个navigationBar.height的向下偏移.
    ///   - completeBlock: 成功回调,在view隐藏后会执行回调
    class func showSuccesshTips (message : String?, view : UIView? = UIApplication.shared.keyWindow ,isTranslucent: Bool = false, completeBlock : (()->(Void))?) {
        self.showHudTips(message: message, icon: "success.png", view: view, isTranslucent: isTranslucent, completeBlock: completeBlock)
    }
    // 展示失败HUD,可自己修改图片,icon图片需要自己添加到项目中,建议大小为64X64
    ///
    /// - Parameters:
    ///   - message: 展示文字
    ///   - view: 父级View,默认是当前展示View
    ///   - isTranslucent: 自己项目中navigationBar是否参与frame设置,默认为False,如果项目中主动将其设置为true,可以传入True.不传的话中弹出view会有半个navigationBar.height的向下偏移.
    class func showErrorMessage(message : String?, view : UIView? = UIApplication.shared.keyWindow,isTranslucent: Bool = false){
        self.showHudTips(message: message, icon: "error.png", view: view, isTranslucent: isTranslucent, completeBlock: nil)
    }
    // 展示失败HUD,可传入HUD隐藏后调用Block
    ///
    /// - Parameters:
    ///   - message: 展示文字
    ///   - view: 父级View,默认是当前展示View
    ///   - isTranslucent: 自己项目中navigationBar是否参与frame设置,默认为False,如果项目中主动将其设置为true,可以传入True.不传的话中弹出view会有半个navigationBar.height的向下偏移.
    ///   - completeBlock: 成功回调,在view隐藏后会执行回调
    class func showErrorMessage (message : String?, view : UIView? = UIApplication.shared.keyWindow,isTranslucent: Bool = false, completeBlock : (()->(Void))?) {
        self.showHudTips(message: message, icon: "error.png", view: view, isTranslucent: isTranslucent, completeBlock: nil)
    }

6.隐藏HUD方法

    /// 隐藏HUD
    class func hideHud () {
        guard let HUD = hud else {
            return
        }
        HUD.hide(animated: true)
        hud = nil
    }

使用方法示例:

1.使用CocoaPods或手动将MBProgressHUD加入项目.

2.将EWMBProgressHUD.swift文件加入项目.

3.调用时:

    @objc private func onClickTopButton(){
        EWMBProgressHud.showTextHudTips(message: "蒙层", view: self.view, isMask: true, afterDelay: 1)
    }
    @objc private func onClickCenterButton(){
        EWMBProgressHud.showTextHudTips(message: "Toast", isTranslucent: true)
    }
    @objc private func onClickLoadingButton(){
        EWMBProgressHud.showLoadingHudView(message: "Loading", isTranslucent: true)
        /// loadingView必需手动隐藏!!!结束loading请调用hideHud()!!!
        DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 1) {
            EWMBProgressHud.hideHud()
        }
    }
    @objc private func onClickSecondLoadingButton(){
        EWMBProgressHud.showLoadingHudView(view: self.view, message: "蒙层Loading", isMask: true)
        /// loadingView必需手动隐藏!!!结束loading请调用hideHud()!!!
        DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 1) {
            EWMBProgressHud.hideHud()
        }
    }
    @objc private func onClickSuccessButton(){
        EWMBProgressHud.showSuccesshTips(message: "Success",afterDelay: 1, isTranslucent: true)
    }
    @objc private func onClickCoverNavigationBarLoadingButton(){
        /// 覆盖navigationBar需要从NavitionController中添加View,所以需要传入navigationController
        EWMBProgressHud.showLoadingHudView(NAVC: self.navigationController, message: "覆盖NavigationBar的LoadingView")
        /// loadingView必需手动隐藏!!!结束loading请调用hideHud()!!!
        DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 1) {
            EWMBProgressHud.hideHud()
        }
    }
    @objc private func onClicKCoverNavigationBarButton(){
        EWMBProgressHud.showTextHudTips(NAVC: self.navigationController, message: "覆盖NavigationBar的蒙层", isMask: true,afterDelay: 1)
    }

demo地址:EWMBProgressHUD

有问题欢迎探讨.

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

推荐阅读更多精彩内容

  • 1、通过CocoaPods安装项目名称项目信息 AFNetworking网络请求组件 FMDB本地数据库组件 SD...
    阳明先生_X自主阅读 15,977评论 3 119
  • 炎炎夏日正午,水牛汪在水里,露个大头,双耳前扇后扇,鼻孔坑嚇坑嚇喷气。 牛娃有的汪在水里,狗刨几下。有的爬到杨树上...
    心花朵朵阅读 500评论 0 0
  • A 我加入了一个义工群,群里的口号是:让一切变得更美好!不久,常州除了一件...
    黍离三戒阅读 259评论 0 1