由于在 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?()
}
}
仅供参考