MBProgressHUD - 对UIView进行扩展

由于在 Swift 的 Extension 里是不能添加存储属性的,我们可以利用 关联对象 以达到所谓的存储属性的效果。(在 OC 中经常使用运行时 Associated Object 关联对象 来给 Category 添加属性,而在 Swift 里,我们同样可以利用关联对象在 Extension 中添加计算属性)
&HudKey.hudKey: & 操作符是取出地址作为 UnsafeRawPointer 参数传入。
.OBJC_ASSOCIATION_RETAIN_NONATOMIC: 是一个 objc_AssociationPolicy 枚举,它有以下几种选择(从字面意思可以看出是与Objective-C中的属性修饰符相关):

public enum objc_AssociationPolicy : UInt {
    case OBJC_ASSOCIATION_ASSIGN
    case OBJC_ASSOCIATION_RETAIN_NONATOMIC
    case OBJC_ASSOCIATION_COPY_NONATOMIC
    case OBJC_ASSOCIATION_RETAIN
    case OBJC_ASSOCIATION_COPY
}
MBProgressHUD 扩展UIview显示Toast
struct HudKey {
    static var hudKey: String = "hudKey"
    static var hudWasHidden: String = "hudWasHidden"
}
//MARK: -Toast提示
extension UIView{
    var hud: MBProgressHUD?{
        get {
            return objc_getAssociatedObject(self, &HudKey.hudKey) as? MBProgressHUD
        }
        set {
            objc_setAssociatedObject(self, &HudKey.hudKey, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
        }
    }
    //hud隐藏后的动作
    var hudWasHiddenBlock: (() -> Void)?{
        get {
            return objc_getAssociatedObject(self, &HudKey.hudWasHidden) as? (() -> Void)
        }
        set {
            objc_setAssociatedObject(self, &HudKey.hudWasHidden, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
        }
    }
    
    
    /// 显示等待消息菊花
    func showWait() {
        hud = MBProgressHUD.showAdded(to: self, animated: true)
        hud?.removeFromSuperViewOnHide = true
    }
    
    /// 隐藏hud
    func hideHud(animated: Bool = true){
        hud?.hide(animated: animated)
    }
    
    /// 显示普通消息
    func showText(msg: String? = "网络错误,请检查网络",
                  afterDelay: TimeInterval = 1.5,
                  completion: (() -> Void)? = nil) {
        self.hudWasHiddenBlock = completion
        hud = MBProgressHUD.showAdded(to: self, animated: true)
        hud?.delegate = self
        hud?.mode = .text
        hud?.label.text = msg
        hud?.removeFromSuperViewOnHide = true
        hud?.hide(animated: true, afterDelay: afterDelay)
    }
    
    /// 显示详情
    func showInfo(msg: String,
                  title: String,
                  afterDelay: TimeInterval = 2,
                  completion: (() -> Void)? = nil){
        self.hudWasHiddenBlock = completion
        hud = MBProgressHUD.showAdded(to: self, animated: true)
        hud?.delegate = self
        hud?.mode = .text
        hud?.label.text = title
        hud?.detailsLabel.text = msg
        hud?.hide(animated: true, afterDelay: afterDelay)
    }
    
    /// 显示自定义图片
    func showImage(img: String, title: String? = nil, msg: String? = nil){
        hud = MBProgressHUD.showAdded(to: self, animated: true)
        hud?.mode = .customView //模式设置为自定义视图
        hud?.customView = UIImageView(image: UIImage(named: img)) //自定义视图显示图片
        hud?.bezelView.color = .clear
        hud?.bezelView.style = .solidColor
        hud?.label.text = title
        hud?.detailsLabel.text = msg
        hud?.removeFromSuperViewOnHide = true
    }
    
    /// 显示自定义动画
    func showCustomAnimate(num: Int, imgName: String){
        var imageArray: [UIImage] = []
        for i in 0...num{
            let image = UIImage(named: imgName + String(i))
            imageArray.append(image!)
        }
        let imgView = UIImageView(image: UIImage(named: imgName + "0"))
        imgView.frame.size = CGSize(width: 80~, height: 80~)
        imgView.animationImages = imageArray
        imgView.animationDuration = 1
        imgView.animationRepeatCount = 0
        imgView.startAnimating()
        hud = MBProgressHUD.showAdded(to: self, animated: true)
        hud?.mode = .customView
        hud?.customView = imgView
        hud?.bezelView.color = .clear
        hud?.bezelView.style = .solidColor
        hud?.removeFromSuperViewOnHide = true
    }
}
extension UIView: MBProgressHUDDelegate{
    // hud隐藏后的操作
    public func hudWasHidden(_ hud: MBProgressHUD) {
        self.hudWasHiddenBlock?()
    }
}

仅供参考

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容