// // ProgressHUD.swift // BiaoGeMusic // // Created by ljy-335 on 14-10-21. // Copyright (c) 2014年 uni2uni. All rights reserved. // import Foundation import UIKit /// /// @brief 样式 enum HYBProgressHUDStyle { case BlackHUDStyle /// 黑色风格 case WhiteHUDStyle /// 白色风格 } /// /// @brief 定制显示通知的视图HUD /// @author huangyibiao class HYBProgressHUD: UIView { var hud: UIToolbar? var spinner: UIActivityIndicatorView? var imageView: UIImageView? var titleLabel: UILabel? /// /// private 属性 /// private let statusFont = UIFont.boldSystemFontOfSize(16.0) private var statusColor: UIColor! private var spinnerColor: UIColor! private var bgColor: UIColor! private var successImage: UIImage! private var errorImage: UIImage! /// /// @brief 单例方法,只允许内部调用 private class func sharedInstance() ->HYBProgressHUD { struct Instance { static var onceToken: dispatch_once_t = 0 static var instance: HYBProgressHUD? } dispatch_once(&Instance.onceToken, { () -> Void in Instance.instance = HYBProgressHUD(frame: UIScreen.mainScreen().bounds) Instance.instance?.setStyle(HYBProgressHUDStyle.WhiteHUDStyle) }) return Instance.instance! } override init(frame: CGRect) { super.init(frame: frame) hud = nil spinner = nil imageView = nil titleLabel = nil self.alpha = 0.0 } required init(coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented") } /// /// 公开方法 /// /// 显示信息 class func show(status: String) { sharedInstance().configureHUD(status, image: nil, isSpin: true, isHide: false) } /// 显示成功信息 class func showSuccess(status: String) { sharedInstance().configureHUD(status, image: sharedInstance().successImage, isSpin: false, isHide: true) } /// 显示出错信息 class func showError(status: String) { sharedInstance().configureHUD(status, image: sharedInstance().errorImage, isSpin: false, isHide: true) } /// 隐藏 class func dismiss() { sharedInstance().hideHUD() } /// /// 私有方法 /// /// /// @brief 创建并配置HUD private func configureHUD(status: String?, image: UIImage?, isSpin: Bool, isHide: Bool) { configureProgressHUD() /// 标题 if status == nil { titleLabel!.hidden = true } else { titleLabel!.text = status! titleLabel!.hidden = false } // 图片 if image == nil { imageView?.hidden = true } else { imageView?.hidden = false imageView?.image = image } // spin if isSpin { spinner?.startAnimating() } else { spinner?.stopAnimating() } rotate(nil) addjustSize() showHUD() if isHide { NSThread.detachNewThreadSelector("hideWhenTimeout", toTarget: self, withObject: nil) } } /// /// @brief 设置风格样式,默认使用的是黑色的风格,如果需要改成白色的风格,请在内部修改样式 private func setStyle(style: HYBProgressHUDStyle) { switch style { case .BlackHUDStyle: statusColor = UIColor.whiteColor() spinnerColor = UIColor.whiteColor() bgColor = UIColor(white: 0, alpha: 0.8) successImage = UIImage(named: "ProgressHUD.bundle/success-white.png") errorImage = UIImage(named: "ProgressHUD.bundle/error-white.png") break case .WhiteHUDStyle: statusColor = UIColor.whiteColor() spinnerColor = UIColor.whiteColor() bgColor = UIColor(red: 192.0 / 255.0, green: 37.0 / 255.0, blue: 62.0 / 255.0, alpha: 1.0) successImage = UIImage(named: "ProgressHUD.bundle/success-white.png") errorImage = UIImage(named: "ProgressHUD.bundle/error-white.png") break default: break } } /// /// @brief 获取窗口window private func getWindow() ->UIWindow { if let delegate: UIApplicationDelegate = UIApplication.sharedApplication().delegate { if let window = delegate.window { return window! } } return UIApplication.sharedApplication().keyWindow } /// /// @brief 创建HUD private func configureProgressHUD() { if hud == nil { hud = UIToolbar(frame: CGRectZero) hud?.barTintColor = bgColor hud?.translucent = true hud?.layer.cornerRadius = 10 hud?.layer.masksToBounds = true /// 监听设置方向变化 NSNotificationCenter.defaultCenter().addObserver(self, selector: "rotate:", name: UIDeviceOrientationDidChangeNotification, object: nil) } if hud!.superview == nil { getWindow().addSubview(hud!) } if spinner == nil { spinner = UIActivityIndicatorView(activityIndicatorStyle: UIActivityIndicatorViewStyle.WhiteLarge) spinner!.color = spinnerColor spinner!.hidesWhenStopped = true } if spinner!.superview == nil { hud!.addSubview(spinner!) } if imageView == nil { imageView = UIImageView(frame: CGRectMake(0, 0, 28, 28)) } if imageView!.superview == nil { hud!.addSubview(imageView!) } if titleLabel == nil { titleLabel = UILabel(frame: CGRectZero) titleLabel?.backgroundColor = UIColor.clearColor() titleLabel?.font = statusFont titleLabel?.textColor = statusColor titleLabel?.baselineAdjustment = UIBaselineAdjustment.AlignCenters titleLabel?.numberOfLines = 0 titleLabel?.textAlignment = NSTextAlignment.Center titleLabel?.adjustsFontSizeToFitWidth = false } if titleLabel!.superview == nil { hud!.addSubview(titleLabel!) } } /// /// @brief 释放资源 private func destroyProgressHUD() { NSNotificationCenter.defaultCenter().removeObserver(self, name: UIDeviceOrientationDidChangeNotification, object: nil) titleLabel?.removeFromSuperview() titleLabel = nil spinner?.removeFromSuperview() spinner = nil imageView?.removeFromSuperview() imageView = nil hud?.removeFromSuperview() hud = nil } /// /// @brief 设置方向变化通知处理 func rotate(sender: NSNotification?) { var rotation: CGFloat = 0.0 switch UIApplication.sharedApplication().statusBarOrientation { case UIInterfaceOrientation.Portrait: rotation = 0.0 break case .PortraitUpsideDown: rotation = CGFloat(M_PI) break case .LandscapeLeft: rotation = -CGFloat(M_PI_2) break case .LandscapeRight: rotation = CGFloat(M_PI_2) break default: break } hud?.transform = CGAffineTransformMakeRotation(rotation) } /// /// @brief 调整大小 private func addjustSize() { var rect = CGRectZero var width: CGFloat = 100.0 var height: CGFloat = 100.0 /// 计算文本大小 if titleLabel!.text != nil { var style = NSMutableParagraphStyle() style.lineBreakMode = NSLineBreakMode.ByCharWrapping var attributes = [NSFontAttributeName: statusFont, NSParagraphStyleAttributeName: style.copy()] var option = NSStringDrawingOptions.UsesLineFragmentOrigin var text: NSString = NSString(CString: titleLabel!.text!.cStringUsingEncoding(NSUTF8StringEncoding)!, encoding: NSUTF8StringEncoding) rect = text.boundingRectWithSize(CGSizeMake(160, 260), options: option, attributes: attributes, context: nil) rect.origin.x = 12 rect.origin.y = 66 width = rect.size.width + 24 height = rect.size.height + 80 if width < 100 { width = 100 rect.origin.x = 0 rect.size.width = 100 } } hud!.center = CGPointMake(kScreenWidth / 2, kScreenHeight / 2) hud!.bounds = CGRectMake(0, 0, width, height) var h = titleLabel!.text == nil ? height / 2 : 36 imageView!.center = CGPointMake(width / 2, h) spinner!.center = CGPointMake(width / 2, h) titleLabel!.frame = rect } /// /// @brief 显示 private func showHUD() { if self.alpha == 0.0 { self.alpha = 1.0 hud!.alpha = 0.0 self.hud!.transform = CGAffineTransformScale(self.hud!.transform, 1.4, 1.4) UIView.animateKeyframesWithDuration(0.15, delay: 0.0, options: UIViewKeyframeAnimationOptions.AllowUserInteraction, animations: { () -> Void in self.hud!.transform = CGAffineTransformScale(self.hud!.transform, 1.0 / 1.4, 1.0 / 1.4) self.hud!.alpha = 1.0 }, completion: { (isFinished) -> Void in }) } } /// /// @brief 隐藏 private func hideHUD() { if self.alpha == 1.0 { UIView.animateKeyframesWithDuration(0.2, delay: 0.0, options: UIViewKeyframeAnimationOptions.AllowUserInteraction, animations: { () -> Void in self.hud!.transform = CGAffineTransformScale(self.hud!.transform, 0.35, 0.35) self.hud!.alpha = 0.0 }, completion: { (isFinished) -> Void in self.destroyProgressHUD() self.alpha = 0.0 }) } } /// /// @brief 在指定时间内隐藏 func hideWhenTimeout() { autoreleasepool { () -> () in var length = countElements(self.titleLabel!.text!) var sleepTime: NSTimeInterval = NSTimeInterval(length) * 0.04 + 0.5 NSThread.sleepForTimeInterval(sleepTime) self.hideHUD() } } }